【问题标题】:javascript self-invoking functions and scopejavascript自调用函数和范围
【发布时间】:2013-09-27 06:48:11
【问题描述】:

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

这是我的问题的简化版本

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 文档就绪事件处理程序,我想立即设置。

【问题讨论】:

标签: javascript function scope


【解决方案1】:

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

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();

)

【讨论】:

  • 我认为你说我混淆了自调用和构造函数是绝对正确的。感谢您的反馈
【解决方案2】:

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

this 的值取决于你调用函数的方式。

如果您调用foo.bar(),那么在bar 内部,this 将是foo

如果您没有foo(例如bar()),则this 的值将是默认对象。在window 的浏览器中。

由于this 在这两种情况下都是window,所以this.load 是相同的。

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

【讨论】:

  • 所以在自调用内部我应该改为使用 x.load=function(){alert()}?谢谢
  • 不! x 直到你给它赋值之后才存在(直到 after 函数被执行)和(如果不是这样的话)你分配给的值它是this,它仍然是window,所以你最终会遇到同样的问题。
  • 感谢您的反馈。通过尝试您的建议,我基本上需要将 var x =self-invoking func 放到 var x = new func 以使其正常工作。而且我只需要找出一种替代方法,在 x 的范围内包含一个 doc ready func,以便立即设置事件处理程序。再次感谢
  • @Quentin: No! x doesn't exist until after you assign a value to it 这根本不是真的。 X 在 js 解释器在编译阶段创建它时存在,但它的值最初是未定义的。在执行阶段,然后将函数的结果分配给它,使其指向全局对象(在浏览器中它将是窗口)。
猜你喜欢
  • 2010-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-15
  • 1970-01-01
  • 2012-04-19
  • 1970-01-01
  • 2012-10-12
相关资源
最近更新 更多