为什么在Javascript中访问自己的对象需要此关键字

时间:2015-04-11 20:04:06

标签: javascript

var simpleObject={n:70};
simpleObject.testMethod=function(){
  console.log(n);
}

为什么我需要在this.n内写console.log来显示输出70

3 个答案:

答案 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 navaluated引用simpleObject.n

使用对运行environment record的LexicalEnvironment execution context的绑定对象的属性查找来解析标识符。最初是[[Scope]]

  

10.4.3 Entering Function Code

     

当控制进入执行时,执行以下步骤   函数对象F中包含的函数代码的上下文,一个调用者   提供了 thisArg ,并且调用者提供了 argumentsList

     

要实现您想要的效果,您需要将正在运行的执行上下文的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中的范围是由文档,表单所有者和元素遮蔽的全局范围:

  
      
  1. 范围成为NewObjectEnvironment(文档全局环境)的结果。
  2.   
  3. 如果表单所有者不为null,请将作用域作为NewObjectEnvironment的结果(表单所有者作用域 )。
  4.   
  5. 如果元素不是 null ,请让Scope为NewObjectEnvironment(元素范围)的结果。
  6.   

然后,您可以让您的对象成为HTML元素,并让您的方法成为internal raw uncompiled handler

var el = document.createElement('div');
el.n = 70;
el.setAttribute('onclick', 'console.log(n)');
el.click(); // 70