Javascript闭包&x27;这';关键字和变量名称空间

Javascript闭包&x27;这';关键字和变量名称空间,javascript,closures,this,naming,Javascript,Closures,This,Naming,我试图理解这个关键字是如何工作的 这篇文章说 在JavaScript中,这总是指我们正在执行的函数的“所有者”,或者更确切地说,指函数作为方法的对象 我推测,由于命名冲突(赋值不明确),调用init()后,getMyVal0是undefined 但是(调用init())之后,getMyVal1为什么返回undefined?对myVal1的引用不应含糊不清。Javascript是否需要显式使用此getMyVal2返回预期值,但我还是很惊讶我需要显式的this 请澄清这种行为 最后,我尝试在初始化成

我试图理解
这个
关键字是如何工作的

这篇文章说

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

我推测,由于命名冲突(赋值不明确),调用
init()
后,
getMyVal0
undefined

但是(调用
init()
)之后,
getMyVal1
为什么返回
undefined
?对myVal1的引用不应含糊不清。Javascript是否需要显式使用此
getMyVal2
返回预期值,但我还是很惊讶我需要显式的
this

请澄清这种行为


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

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

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

function Constructor() {
  var x, y;

  x = "whatever";
}
在该代码中,变量“x”和“y”是局部变量,不是对象的属性

在MDN上阅读这篇文章

的值取决于调用函数的方式。但是您根本不调用
init
,所有变量仍然
未定义

按照行业惯例,
这个
应该允许我避免为一个变量使用两个名称

不。JavaScript中的
与Java等其他语言中的
不同。它不允许您从更高的范围访问变量。在您的例子中,
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"
顺便说一句,您可以将
closure
init
调用组合到一个函数中:

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"

ECMAscript 2-6-2第3版以及ES5中的
var
关键字几乎只说“在当前上下文中声明该变量”<代码>另一边的这个
总是指“调用对象”(我喜欢如何称呼它),这是一个不同的故事

函数的
上下文
不能通过Javascript本身直接访问,它只存在于底层
词典环境
(ES5)或
执行上下文->激活对象
(ES3)中

因此,通过显式调用
this.xxx
,您正在读写OOI(根据调用方法的方式,OOI可能会发生变化)。
“激活对象”
保持不变

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

所有这些东西都存储在对象中,该对象由
this
引用您所说的?@Pointy IRR=“内部收益率”是什么意思。我的意思是,按照我的行业惯例,IRR被用作变量名。其目的是尽可能避免IRR1、IRR2。您认识到,通过不使用
var
声明
init
getMyVal
函数,您正在创建全局变量,对吗?此外,如果您发现自己希望在同一名称上有编号的变体,您可能需要一个数组。抱歉,我不清楚<正在调用code>init()
。我不知道这是否会影响你的答案。我编辑了我的问题。好的,我添加了一个注释示例脚本。澄清一下:
这个
有一个非常不同的方法,与作用域无关。同意,PPK文章应该进行健康的垃圾收集。如果“所有权”还不够糟糕的话,我们就会收到一篇关于“复制”的奇幻论文。
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"