当使用JSON定义的函数时,是否可以使用相对语法访问JSON属性?

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

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

上面的JavaScript代码将会提示“undefined”。 为了使其真正起作用,代码需要像下面这样写……(请注意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'. IT RETURNS 'Hello World' and not undefined - vijay
3个回答

6
您的第一个例子有效,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对象字面量语法不同,例如:

{ foo: "bar" }

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


0

不行。

首先,这不是 JSON。你所拥有的只是一个对象字面量。JSON 是一种数据格式,不支持函数。

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

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

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

你已经知道了一种解决方法 - 你的第二个代码片段。你的另一个选择是实际上使用 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();


1
不,只有在引用被调用时没有基对象时,this才指全局对象,例如myFunc();。在他的例子中,基对象是myCode,因此myCode.helloWorld.call( myCode );是多余的。 - Christian C. Salvadó
那就是我喝了三杯啤酒后发帖的后果。祝大家五月五日快乐! - Peter Bailey
下次喝啤酒时记得叫上我。 - Rolf

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接