JavaScript&自我执行功能

时间:2013-06-11 04:42:41

标签: javascript jquery function

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

(function($) {

  var name = '';

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

}(jQuery));

2 个答案:

答案 0 :(得分: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();

请参阅How do JavaScript closures work?

答案 1 :(得分: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个作用域由三个函数创建,在最里面,你可以访问具有唯一名称(scope1,scope2和scope3)的变量以及局部变量name,是一个与中间范围不同的名称。重复使用这样的变量名来阻止访问外部作用域中的变量称为阴影。

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

相关问题