var simpleObject={n:70};
simpleObject.testMethod=function(){
console.log(n);
}
为什么我需要在this.n
内写console.log
来显示输出70
。
答案 0 :(得分:0)
'this'关键字指的是对象本身,属性n是对象的成员,因此必须通过该命名空间'this.n'访问它。
但是如果变量是在同一个函数(即testMethod)中声明的,那么通过'var n = 0',然后在同一个闭包/范围内你可以只用'n'(没有'this')访问变量。
但属性n在'testMethod'函数范围之外,因此必须通过适当的命名空间访问 - 因此'this.n'。
答案 1 :(得分:0)
JavaScript是一种动态语言。这实际上意味着它使用动态名称解析和函数对象。因此,您可以从一个对象获取函数并将其分配给另一个对象。考虑一下:
var simpleObject={n:70};
simpleObject.testMethod=function(){console.log(this.n);}
var simpleObject2={foo:42};
simpleObject2.testMethod = simpleObject1.testMethod;
simpleObject.testMethod();
simpleObject2.testMethod();
这里的两个对象都使用相同的功能,第一个调用将打印70.但第二个将打印undefined
。
答案 2 :(得分:0)
this
不是必需的,它只是一种方法。另一种琐碎的方式是simpleObject.n
。
但是,您似乎希望identifier n
为avaluated引用simpleObject.n
。
使用对运行environment record的LexicalEnvironment execution context的绑定对象的属性查找来解析标识符。最初是[[Scope]]
:
当控制进入执行时,执行以下步骤 函数对象F中包含的函数代码的上下文,一个调用者 提供了 thisArg ,并且调用者提供了 argumentsList :
- 让 localEnv 成为调用NewDeclarativeEnvironment传递[[Scope]]值的结果 F 的内部属性作为参数。
- 将LexicalEnvironment设置为 localEnv 。
要实现您想要的效果,您需要将正在运行的执行上下文的LexicalEnvironment设置为NewObjectEnvironment(this,oldEnvironment)。
您可以使用width
statement:
with
语句为a添加object environment record 将对象计算到当前的lexical environment 执行上下文。然后使用此扩充执行语句 lexical environment。最后,它会恢复原始的lexical environment。
var simpleObject = {n: 70};
simpleObject.testMethod = function(){
with(this) {
console.log(n);
}
};
simpleObject.testMethod(); // 70
但请注意,不鼓励使用with
,并且不会在严格模式下工作。
另一种方法是利用event handler content attributes中的范围是由文档,表单所有者和元素遮蔽的全局范围:
- 让范围成为NewObjectEnvironment(文档,全局环境)的结果。
- 如果表单所有者不为null,请将作用域作为NewObjectEnvironment的结果(表单所有者,作用域 )。
- 如果元素不是 null ,请让Scope为NewObjectEnvironment(元素,范围)的结果。
醇>
然后,您可以让您的对象成为HTML元素,并让您的方法成为internal raw uncompiled handler:
var el = document.createElement('div');
el.n = 70;
el.setAttribute('onclick', 'console.log(n)');
el.click(); // 70