0

我正在尝试理解(可能是简单的概念)关于 JS 的内容,并且我将下面的代码放在一起来解释我没有得到的东西。我不明白的是 name 变量的存储位置。这个变量现在是全局的吗?

(function($) {

  var name = '';

  $.helloWorld = function(yourName) {
    name = yourName;
    console.log("Hello " + yourName);
  }

}(jQuery));
4

2 回答 2

4

name变量是外部函数的局部变量,因为它是用var关键字声明的。内部函数是一个包含对该变量的引用的闭包。这是一个更好的例子来展示这一点:

(function($) {

  var name = '';

  $.setName = function(newName) {
    name = newName;
  }

  $.showName = function() {
    console.log("Name is: " + name);

}(jQuery));

定义后,您可以执行以下操作:

$.setName("Larry");
$.showName();
$.setName("Fred");
$.showName();

请参阅JavaScript 闭包如何工作?

于 2013-06-11T04:45:17.527 回答
2

这应该可以帮助您理解:

(function(){

    var name;
    var scope1;

    // Here you can use scope1 and name

    (function(){

        var name;  //  <------------------------
        var scope2;                         // |
                                            // |
        // Here you can use scope1,scope2, and name

        (function(){

            var name;   //  <------------------------------
            var scope3;                                 // |
                                                        // |
            // Here you can use scope1,scope2,scope3, and name

        })();

     })();

})();

// Any\variable declared outside of any function scope is in the global scope.
// A variable declared here can be accessed by window.name from any scope
var name = 5;

因此,在此代码段中,三个函数创建了 3 个作用域,在最里面,您可以访问具有唯一名称的变量(作用域 1、作用域 2 和作用域 3)以及局部变量name,它与它的名字不同中间范围。像这样重用变量名来防止访问外部范围内的变量称为遮蔽。

请注意,未使用关键字声明的变量var被自动假定为在全局范围内。在全局范围内声明许多变量是一种不好的做法,因为它们很容易与其他脚本发生冲突。

于 2013-06-11T04:53:27.250 回答