【问题标题】:javascript functions and this keyword, contextjavascript 函数和 this 关键字,上下文
【发布时间】:2013-02-17 16:57:39
【问题描述】:

这里是代码

obj = {
    a: 'some value';
    m: function(){
        alert(this.a);
    }
}

obj.m();

结果是'some value'

听说这个关键字指的是函数的拥有者obj。 现在的问题是上面代码中函数的所有者是obj 那么为什么当函数有所有者时使用这个关键字很重要,上面的代码应该 以下列方式工作

obj = {
    a: 'some value';
    m: function(){
        alert(a);
    }
}

obj.m();

我知道哪个不起作用,但为什么?

【问题讨论】:

  • 函数没有真正的所有者。
  • 函数和对象之间没有特殊关系。一个对象可以引用一个函数,但随后几个对象可以同时引用同一个函数。函数本身只是另一种原生对象,例如数组。
  • 非常感谢你,这是有道理的。

标签: javascript keyword


【解决方案1】:

a 在函数m 范围内不可用。

a 是对象 obj 的一个属性,并且只能在 obj 的上下文中作为 obj.athis.a 使用。

由于obj.m()a 的上下文中执行m,因此您可以使用this.a 内部函数m 访问a

在 JavaScript 中,this 的使用是强制性的。

在 Java 或 C++ 等其他语言中,this 的使用是可选的。如果 Java / C++ 中没有局部变量,但 JavaScript 中没有,x 会自动解析为 this.x

【讨论】:

    【解决方案2】:

    当你说哪个对象“拥有”一个函数时,我认为你有点困惑。 “this”关键字就像一个变量,它指向函数调用的任何对象。

    例如,您可以编写如下函数:

    函数 logThis(){ console.log(this.a); }

    现在,您可以制作两个不同的对象:

    var objOne = { a: "I am a string storage at the key a", func: logThis }

    var objTwo = { 功能:logThis }

    请注意,这两个对象都有一个名为“func”的键,并且该键用于存储“logThis”函数。这意味着 objOne.func 与 objTwo.func 相同;并且它们都与 logThis(){console.log(this.a)}

    相同

    现在,如果您调用 objOne.func(),它将记录“我是存储在键 a 处的字符串”,调用 func 的对象是 objOne,即存储在 objOne.a 中的字符串

    相比之下,如果您调用 objTwo.func(),您将得到“未定义”。这是因为 objTwo 是调用 func 的对象,而 objTwo 没有任何名为 a 的属性。

    【讨论】:

      猜你喜欢
      • 2018-06-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-20
      • 2011-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多