4
var name=“窗口”;var对象={name:“Object”,getName:function(){返回this.name;}}(object.getName)()//“对象”(object.getName=对象.getName)()//“窗口”

我运行这段代码,它返回“窗口”,而我认为它应该是“对象”。请告诉我为什么?谢谢。

5

4个答案4

重置为默认值
var name=“窗口”;

全局声明创建全局/窗口对象的属性。这相当于(或多或少):

var全局=此;global.name=“窗口”;

表达式:

(object.getName=对象.getName)

返回由引用的函数对象.get名称以下空参数列表(即())使其被调用。

自从值不是由调用设置的,它默认为全局/窗口对象,因此函数返回全球名称.

2
  • 但为什么(object.getName)()返回“object”?
    ——黄先生
    2013年4月19日5:09
  • 因为当您将函数作为对象,其参考文献对象.所以this.name(此名称)收益对象名称,即字符串“Object”。也许你应该使用一些不同的值来让它更清晰。
    ——罗布·G
    2013年4月19日5:35
1

混乱的底线是我们正在尝试执行

(object.getName=对象.getName)();

我们认为它应该打印“Object”。

事实上,它不会。这里有一个简单的原因。如果你把这句话分成两段,你就会得到它。

  • 分配:object.getName被分配了一些处理程序。在这种情况下,它被分配给自身。
  • 处理程序的执行。现在,处理程序已被执行,但这次我们没有上下文。处理程序由窗口执行。所以您得到的是window.name,它是“窗口”

试试这个

var x=对象名称;x();

这有点像你的案例,它给出了“窗口”同样的原因,x也是由window执行的。

0

而不是思考以你习惯的经典OOP方式,想想作为调用函数的上下文。

在示例代码中,窗口是的上下文获取名称调用,无论该函数在何处声明。

0
var x=对象名称;x();

不太一样。“=”只确保x引用与object.getName相同的内存地址,但x属于window,而object.getName属于object。我认为问题来自赋值表达式的返回值。可能有一个临时变量来接收(object.getName=object.getName)的值,

var temp=(object.getName=对象.getName);温度()//“窗口”

因此可能有意义。

你的答案

单击“发布您的答案”,表示您同意我们的服务条款并确认您已阅读我们的隐私政策.

不是你想要的答案吗?浏览标记的其他问题问你自己的问题.