javascript自我调用函数和范围

时间:2013-09-27 06:48:11

标签: javascript function scope

这将是一个新手问题,但是答案可能很简单,我正在努力理解这个概念。任何反馈将不胜感激

这是我的问题的简化版

var x=(function(){
    this.load=function(){
        alert("this is x load");
    };
    return this
})();

var y=(function(){
    this.load=function(){
        alert("this is y load");
    };
    return  this
})();

x.load();
y.load();

执行结果为
x.load和y.load

的警报(这是y加载)

我的问题
为什么x访问var y.load?我认为bc每个加载函数都包含在它自己的自调用匿名函数中,它只能通过相应的变量访问

另外,为了得到我想要的东西(让.load()在变量的范围内),什么是声明这些对象的最佳方法。(我只需要每个x的1个实例)和y)

我想在这些函数中坚持自我约束的bc,我打算让jquery文档就绪事件处理程序,我想立即设置。

2 个答案:

答案 0 :(得分:0)

自调用函数将为您提供一次性范围,允许您创建闭包或仅使用变量而不会污染全局对象。 '这'不受影响。您可能会对构造函数/ new运算符语法感到困惑,它将为此提供一个新值,因此具有您所寻求的行为:

var x = new function () {
        this.load = function () {
            alert("this is x load");
        }
    }();

var y = new function () {
        this.load = function () {
            alert("this is y load");
        }
    }();

x.load();
y.load();

。 。

(对于记录,使用构造函数的正确方法更像是这个:

function Alerter(alerterName) {
    this.name = alerterName;
}

Alerter.prototype.load = function () {
    alert('this is ' + this.name + ' load');
};

var x = new Alerter('x');
var y = new Alerter('y');

x.load();
y.load();

答案 1 :(得分:-1)

这不是范围,而是上下文,并且您没有x.loady.load

this的值取决于您如何调用函数。

如果您致电foo.bar(),则在bar内,this将为foo

如果您没有foo(例如bar()),则this的值将成为默认对象。在window

的浏览器中

由于this在两种情况下均为window,因此this.load是相同的。

可能您想使用局部变量(var load)或the new keyword