4

jquery网站关于javascript范围的在线文档有问题。有代码;

(function() {

var baz = 1;

var bim = function() {
    console.log( baz );
};

bar = function() {
    console.log( baz );
};

})();

并说:

console.log( baz ); // baz is not defined outside of the function

我不明白的是,即使baz已定义,为什么console.log(baz)未定义。因为我认为范围是一样的。我错过了什么?

4

3 回答 3

5

陷阱是IIFE- 立即调用的函数表达式,它创建自己的范围。

JS 使用函数作用域

所以在 IIFEbaz之外没有定义。

change this to :

(function() {

 window.baz = 1;     <----

var bim = function() {
    console.log( baz );
};

bar = function() {
    console.log( baz );
};

})();

它会起作用。

ps

这就是 jQuery 将 $ /jQuery 附加到窗口的方式(当他们以 bla bla.. 结束时)。(只有 window.$ 位于最后一行)。

于 2013-11-05T07:28:36.763 回答
0

可能是您处于“严格模式”下吗?在 Chrome 控制台中,一切正常。调用“baz”写 1 。

jsfiddle检查jsfiddle.net/Yjq2v/

于 2013-11-05T07:29:55.620 回答
0

我不明白的是,即使 baz 已定义,为什么 console.log(baz) 未定义

它是未定义的,因为它的范围被限制(私有)到 IIFE(立即调用函数表达式)范围。

如果将变量链接到 Window 对象,它将可以全局访问。

演示

(function() {

  window.baz = 1; // Global
  var pub    = 2; // private

  var bim = function() {
    console.log( baz );
  };

  var bar = function() {
    console.log( pub ); 
  };

  bim(); // 1 //////////
  bar(); // 2 //////////

})(); 


console.log( baz ); // 1 //////////
console.log( pub ); // Ref.Error //
于 2013-11-05T07:33:02.530 回答