2

我试图了解this关键字的工作原理。

这篇文章this 关键字声明

“在 JavaScript 中,this 总是指我们正在执行的函数的“所有者”,或者更确切地说,指的是函数作为方法的对象。”

function someClosure() {
    var myVal0, myVal1, myVal2;

    init = function (myVal0, myVal1, myVal2) {

        myVal0 = myVal0;
        this.myVal1 = myVal1;
        this.myVal2 = myVal2;

    };

    getMyVal0 = function() { return myVal0 };
    getMyVal1 = function() { return myVal1 }
    getMyVal2 = function() { return this.myVal2 }
};

我猜getMyVal0是因为undefined命名init()冲突(分配不明确)而被调用。

但是(在调用之后init())为什么getMyVal1返回undefined?引用myVal1不应含糊不清。Javascript 是否需要明确使用thisgetMyVal2返回预期值,但我很惊讶我需要明确的this.

请澄清这种行为。

最终,我试图在初始化成员变量时为函数参数建立一个命名约定。按照行业惯例,IRR 是 IRR,它似乎this应该允许我避免为变量使用两个名称(而不总是用 . 引用成员变量this。)做我想做的事情的约定是什么?

4

3 回答 3

3

那么PPK在那篇文章中根本不正确。指针的this值在每次函数调用时重新确定。JavaScript 中没有“方法所有权”之类的东西。当this作为对象属性引用的结果调用方法时,指针会获得一个值,这是真的,但同一个方法可以是许多不同对象的属性。

this除此之外,重要的是要理解构造函数中的局部变量与对象所指的对象属性完全不同。那是,

function Constructor() {
  var x, y;

  x = "whatever";
}

在该代码中,变量“x”和“y”是局部变量,而不是对象的属性。

于 2012-08-02T15:11:41.540 回答
3

ECMAscript 2-6-2 第 3 版以及 ES5 中的var关键字几乎只说“在当前上下文中声明该变量”。this另一方面总是指“调用的对象”(我喜欢怎么称呼它),这是另一回事。

contextfor 函数不能通过 Javascript 本身直接访问,它只存在于底层( lexicalEnvironmentES5) 或Execution Context -> Activation Object(ES3) 中。

因此,通过显式调用,this.xxx您正在读取和写入 OOI(根据调用方法的方式,它可能会发生变化。持有"Activation Object"

  • 形式参数
  • 声明的变量var
  • 函数声明

所有这些东西都没有存储在 . 引用的对象中this

于 2012-08-02T15:13:12.550 回答
2

阅读MDN 上的关键字介绍this

的值this取决于您如何调用该函数。但是您根本不调用init,并且所有变量仍然是undefined.

按照行业惯例,this应该允许我避免为变量提供两个名称

thisJavaScript 中的不与thisJava 等其他语言不同。它不会让您从更高的范围访问变量。在您的情况下,init函数的参数只是隐藏变量myClosure- 您无法访问它们。如果需要,您需要重命名它们。使用这个脚本:

var init, getMyVal; // global, or at least "outer", variables

function closure() {
    var myVal, myVal2; // scoped to the closure

    // all the following function can access them
    init = function(val, myVal2) {
        myVal = val; // assign the argument to the closure variable
        // myVal2 === myVal2 - sorry, this only refers to the argument
    };
    getMyVal = function() {
        return myVal; // get the closure variable
    };
};
closure(); // execute it - you might also have used a immediately-executing function

init("some value");

getMyVal(); // "some value"

顺便说一句,您可以将closureandinit只调用一个函数:

var getMyVal;
function initClosure(myVal) {
    // the argument is scoped to this function, like a var declaration

    getMyVal = function() { return myVal; };
}
initClosure("some value");

getMyVal(); // "some value"
于 2012-08-02T15:12:02.997 回答