【问题标题】:Function in JavaScript ObjectJavaScript 对象中的函数
【发布时间】:2016-02-04 08:32:20
【问题描述】:
var stack_1 = 
       {
          sp: 10,
          stk: new Array(10),

          push: function (v)
          { 
            sp = sp - 1; 
            stk[sp] = v; 
          }
    } 

问题:

这个程序不起作用。因为我们需要写“this.sp”等。我不明白如果函数完全属于“stack_1”,为什么我们需要写“this.sp”。

【问题讨论】:

  • this 取决于函数的调用方式,而不是定义的位置。
  • 这就是 javascript 的工作方式 - 例如,与 c# 不同,它不会“假设”您想要 this 上下文来访问您正在访问的任何内容
  • 只要变量在本地范围内,就没有必要使用this.variable,当然,除非在对象外部存在同名变量,但可以从对象内部访问。
  • 我在想既然函数“push”属于“stack_1”,“push”应该可以访问“stack_1”的所有内容。

标签: javascript function object


【解决方案1】:

因为this 指的是当前对象,即您的示例中的stack_1。而 sp,stk 是 stack_1 的属性,但不是 push 函数的属性。这就是为什么你需要使用this.sp 来表示你正在使用stack_1 对象的sp 属性。

这就是 JavaScript 的工作原理。

【讨论】:

  • 嘿,我在想既然函数“push”属于“stack_1”,“push”应该可以访问“stack_1”的所有内容。
【解决方案2】:

上下文通常由函数的调用方式决定。当函数作为对象的方法被调用时,this 被设置为调用该方法的对象, 示例:

var obj = {
foo: function(){
    alert(this === obj);    
}
};

obj.foo(); // true

【讨论】:

    【解决方案3】:

    spstk 不是变量,它们是对象属性。并且必须相对于特定对象访问属性。

    您可以更改函数以使用stack_1.spstack_1.stk 来访问该对象的属性。

    或者您可以使用this.spthis.stk。使用this时,必须将函数调用为stack_1.push(),因为特殊变量this只有在调用与特定对象相关的函数时才会自动设置。

    这对于您的简单案例来说似乎是多余的,但是当您使用原型或继承时,它是有意义的。在这种情况下,多个对象可以共享同一个功能,它需要知道对哪个对象进行操作。设置this的机制在所有情况下都是一样的。

    【讨论】:

      【解决方案4】:

      值得注意的一点是,您可以在函数内更改上下文/this,使用callapply 显式设置它:

      var stack_1 = {
        sp: 10,
        stk: new Array(10),
      
        push:function (v)  {
          this.sp = this.sp - 1;
          this.stk[this.sp] = v;
          console.log(this)
        }
      }
      
      var stack_2 ={
        sp: 22,
        stk: new Array(20)
      }
      
      stack_1.push(42)
      console.log(stack_1.stk)
      
      stack_1.push.call(stack_2,55)
      console.log(stack_2.stk)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-25
        • 2011-10-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多