JavaScript 自调用函数和作用域

javascript self-invoking functions and scope

本文关键字:作用域 函数 调用 JavaScript      更新时间:2023-09-26
这将

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

这是我问题的简化版本

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

执行结果为
警报(这是 y 负载)对于 x.load 和 y.load

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

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

我想在这些函数中坚持自我参与 bc,我计划让 jquery 文档准备好事件处理程序,我想立即设置它。

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

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

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

this的值由调用函数的方式决定。

如果你打电话给foo.bar()那么,在bar里面,this将被foo

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

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

您可能想使用局部变量(var load)或new关键字。