Javascript作用域未定义

Javascript作用域未定义,javascript,scope,Javascript,Scope,我对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 我不明白的是,即

我对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)
没有定义。因为我觉得范围是一样的。我错过了什么吗?

陷阱是
IIFE
立即调用的函数表达式,它创建了自己的作用域

JS正在使用函数范围

因此,
baz
不是在该生命之外定义的

change this to :

(function() {

 window.baz = 1;     <----

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

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

})();
将此更改为:
(功能(){
window.baz=1;可能是您处于“严格模式”?在Chrome控制台中一切正常。调用“baz”写入1

jsfiddle检查
jsfiddle.net/Yjq2v/

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

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

如果将变量链接到窗口对象,则可以全局访问它

(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 //

您可以在IIFE(立即调用的函数表达式)中看看这个问题吗变量作用域是私有的,只能在函数作用域内使用。请尝试使用
window.baz=1;
我不认为真正的问题是如何使变量在函数作用域之外可访问..使用window.baz只会污染全局作用域..这个示例应该真正意味着,尽管您不能使用console.log在IIFE之外,您可以调用bar,它可以引用baz,因为bar也在同一范围内定义。任何用
var
声明的变量只能在其定义的函数内访问。他正在运行
console.log(baz)
在IIFE范围之外谢谢我错过了立即调用的函数表达式。我现在明白了非常感谢