【问题标题】:Is it possible to access JSON properties with relative syntax when using JSON defined functions?使用 JSON 定义的函数时,是否可以使用相对语法访问 JSON 属性?
【发布时间】:2010-05-05 21:36:39
【问题描述】:
// JavaScript JSON
var myCode = 
{
   message : "Hello World",

   helloWorld : function()
   {
     alert(this.message);
   }
};
myCode.helloWorld();

上面的 JavaScript 代码会提示“未定义”。

要使其真正起作用,代码需要如下所示...(注意 myCode.message 的文字路径)

// JavaScript JSON
var myCode = 
{
   message : "Hello World",

   helloWorld : function()
   {
     alert(myCode.message);
   }
};
myCode.helloWorld();

我的问题是......如果我以这种方式使用 json 声明函数,是否有一些“相对”的方式来访问 myCode.message,或者是否只能使用文字命名空间路径 myCode.message 来访问?

【问题讨论】:

  • The above JavaScript code will alert 'undefined'. 它返回 'Hello World' 而不是 undefined

标签: javascript json namespaces this


【解决方案1】:

您的第一个示例有效,helloWorld 函数中的 this 值将引用 myCode 对象本身,因为您通过 myCode.helloWorld(); 调用它

当您调用作为对象成员的函数时,该对象将被设置为该函数的this 值。

在这种情况下,myCodemyCode.helloWorld 引用的基础对象

关于this关键字是如何隐式还有两种情况,例如,当你调用一个没有绑定为任何对象属性的函数时,即:

myFunc();

myFunc 中的this 值将指向全局对象。

当您使用new 运算符时:

var obj = new MyFunc();

MyFunc 中的 this 值将引用一个新创建的对象。

您可以使用callapply 显式设置函数的this 值:

function test () {
  return this + " World";
}
test.call("Hello"); // "Hello World"

请注意,那不是JSON,JSON 只是一种数据交换格式,它的语法与 JavaScript Object Literal syntax 不同,例如:

{ foo: "bar" }

上面是一个有效的 JavaScript 对象字面量,但不是有效的 JSON,JSON 要求属性标识符用引号括起来,并且它允许的数据类型有限,例如,你不能有 函数 作为 JSON 对象的成员。

【讨论】:

    【解决方案2】:

    没有。

    首先,这不是 JSON。您在这里拥有的只是一个对象文字。 JSON 是一种数据格式,不支持函数。

    其次,了解绑定的工作原理。

    除非通过call()apply() 显式绑定或在实例化对象的方法中使用,否则this 始终引用当前的window 对象。

    由于您将myCode 定义为对象字面量,因此“实例化对象”的情况不适用。此外,您没有使用call()apply(),因此它们也不适用。因此,在您的第一个示例的代码中,this 等于 window,这就是您未定义的原因(因为 window.message 未定义)。

    您已经知道解决此问题的一种方法 - 您的第二个代码 sn-p。您的另一个选择是实际使用call()apply()

    var myCode = 
    {
       message : "Hello World",
    
       helloWorld : function()
       {
         alert( this.message );
       }
    };
    myCode.helloWorld.call( myCode );
    

    这样,您基本上是在告诉 Javascript 使用 myCode 作为 this,它会按预期工作。

    另一种选择是使myCode 可实例化。

    var myCode = function()
    {
      this.message = 'Hello World';
      this.helloWorld = function()
      {
        alert( this.message );
      }
    }
    var mc = new myCode();
    mc.helloWorld();
    

    【讨论】:

    • 否,this 仅在被调用的引用中没有 基础对象 时才引用全局对象,例如 myFunc();。在他的示例中,基础对象是myCode,它可以工作,myCode.helloWorld.call( myCode ); 是多余的。
    • 这就是我在 3 杯啤酒后发布的结果。 ¡ 费利斯五月五日节!
    • 下次你喝啤酒的时候算我一个
    【解决方案3】:

    CMS 一针见血,如果您想了解更多信息,可以查看http://www.scottlogic.co.uk/blog/chris/2010/05/what-is-this/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-04
      • 1970-01-01
      • 1970-01-01
      • 2015-01-18
      • 1970-01-01
      • 1970-01-01
      • 2023-03-20
      • 2012-12-01
      相关资源
      最近更新 更多