了解JavaScript变量范围将有所帮助: http://www.w3schools.com/js/js_scope.asp
现在来到你的代码。 在第一个片段中,变量'ray'被赋值为自执行函数返回的值,这是返回的对象。它类似于此:
var ray = {
speak: function(){
console.log("Haseeb");
}
};
所以现在下面的语句是“雷”的有效有一个属性“说话”
ray.speak();
然而,在片段的第二部分,不会返回任何通过自我执行的功能,因此,它类似于:
var ray = undefined;
现在的声明“ray.speak()
”是等同于执行“undefined.speak()
”,这将抛出一个错误,很明显。
此外,执行obj.speak
与执行'undefined.speak()
'相同,因为变量'obj'仅在该自执行功能内可用。在函数之外,'obj'没有被定义。
希望这会有所帮助。:)
编辑:
说明你对return语句的问题:
return语句返回无论是在它前面的代码/语句的输出。
例子:
var a = 2;
return a; // will return a's value, i.e. '2'
var obj = { x:1 };
return obj; // will return the obj variable's value i.e. { x:1 }
var a = 1;
return a > 1; // will return false i.e. what 'a > 1' outputs after execution
所以,如果你写
return obj = { x:1 };
这将返回什么分配 '的obj = {x:1}' 的输出,这是OBJ分配的值。
现在来到你的代码
var ray = (function(){
return obj = {
speak: function(){
console.log("Haseeb");
}
}
})();
这里return语句不作OBJ提供给函数之外的范围,它只是返回obj的值,然后将其分配给“雷”。 之所以能够做到obj.speak()
而没有得到任何异常,是因为您已经使用了变量obj,而没有在函数中使用'var'关键字声明它,导致'obj'在全局范围内自动声明。这就是为什么你可以在函数之外访问'obj'的原因。
如果你改变你的代码如下:
var ray = (function(){
var obj;
return obj = {
speak: function(){
console.log("Haseeb");
}
}
})();
您将获得异常,而试图执行obj.speak()
功能之外。因为'obj'现在只在函数内声明并可用。
我建议阅读一些关于JavaScript中变量作用域的教程,并在控制台上播放一下。 :)
希望这会有所帮助:)
如果你不声明obj里面的函数,那么它将成为窗口对象。 – Mahi
如果我声明ray.obj,该怎么办?类似顶部ray.speak –
因为你没有返回,那么射线将是不确定的。最好从对象声明中删除'var'。 – Mahi