gpt4 book ai didi

Javascript 模块模式、范围和 "this"

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:36:00 26 4
gpt4 key购买 nike

我正在努力构建自定义 JavaScript 库。我已经阅读了很多关于模块模式的内容,还阅读了 Crockford 关于私有(private)成员和公共(public)成员的文章。我知道什么是立即调用的函数表达式以及为什么我们做类似的事情

var myLib = (function() {
}())

但是,在某些情况下,我仍然对一般范围和闭包有些迷茫。我遇到的具体问题是:

为什么下面的例子警告 DOMWindow,而不是 myLib 对象? http://jsfiddle.net/slavo/xNJtW/1/

如果您能解释该示例中所有方法中的“this”指的是什么以及原因,那就太好了。

最佳答案

在如下声明(任何地方)和调用的任何函数内 this 将是窗口对象

function anyFunc(){
alert(this); // window object
}

anyFunc();


var anyFunc2 = function(){
alert(this); // window object
}

anyFunc2();

如果你想创建私有(private)函数并访问'myObject'的实例,你可以遵循以下任一方法

一个

module = (function () {

var privateFunc = function() {
alert(this);
}

var myObject = {
publicMethod: function() {
privateFunc.apply(this); // or privateFunc.call(this);
}
};

return myObject;
}());


module.publicMethod();

两个

module = (function () {

var _this; // proxy variable for instance

var privateFunc = function() {
alert(_this);
}

var myObject = {
publicMethod: function() {
privateFunc();
}
};
_this = myObject;
return myObject;
}());


module.publicMethod();

这些是您问题的解决方案。我建议使用基于原型(prototype)的对象。

编辑:

您可以使用第一种方法。

实际上这里的myObjectprivateFunc在同一个范围内,你可以直接在函数内部使用它

 var privateFunc = function() {
alert(myObject);
}

您可以为 this 使用代理的真实场景如下所示。您也可以使用 call

Module = function () {

var _this; // proxy variable for instance

var privateFunc = function() {
alert(this + "," + _this);
}

this.publicMethod = function() {
privateFunc(); // alerts [object Window],[object Object]
privateFunc.call(this); // alerts [object Object],[object Object]
}

_this = this;
return this;
};

var module = new Module();
module.publicMethod();

关于Javascript 模块模式、范围和 "this",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9604929/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com