我正在学习JavaScript中的对象字面量和自执行函数。在查看一些YUI代码时,我发现了一个对象字面量的一些方法会自行执行。我的问题是为什么以下代码不会弹出“Ohai Mark!”的提示框:
var bar = {
alert: function () {
window.alert('Ohai Mark!');
},
init: (function () {
bar.alert();
}())
};
我正在学习JavaScript中的对象字面量和自执行函数。在查看一些YUI代码时,我发现了一个对象字面量的一些方法会自行执行。我的问题是为什么以下代码不会弹出“Ohai Mark!”的提示框:
var bar = {
alert: function () {
window.alert('Ohai Mark!');
},
init: (function () {
bar.alert();
}())
};
> var bar = {
> alert: function () {
> window.alert('Ohai Mark!');
> },
> init: (function () {
> bar.alert();
> }())
bar将在右侧表达式被评估后被赋值。在该评估过程中,bar具有语句(整行)到达时的任何值。它目前为undefined,因此尚未具有alert属性。
> };
var bar = {
init: (function () {
var alert = function () {
window.alert('Ohai Mark!');
};
alert(); //this will execute the code above
}())
};
(function() {
var c = c + 1;
})();
所有内容都在一个全局共享命名空间中定义
忽略了函数作用域。A在全局作用域中定义了一个名为foo的变量
不是这样的,在该示例中,foo将在代码执行时作为全局对象的属性创建。对“提升”的解释很差,没有提到变量实例化阶段(它应该),因此将“提升”与作用域(不同的概念)混淆。还有许多其他问题-总体趋势是可以的,但存在许多非正式错误。 - RobG
var bar = (function () { function alert() { alert('hi'); } return {alert: alert}}())
然后像这样简单地调用alertbar.alert()
。你认为这是更好的方法吗? - dunnza