<script>
window.jssdk = {
};
function test(){
alert('hello');
}
jssdk[test] = test(); // 1
</script>
</head>
<body>
<button onclick="jssdk[test]">hello1</button> <!--2-->
<button onclick="jssdk.test()">hello2</button> <!--3-->
</body>
首先是不太明白1中的赋值。
其次1中为什么会执行test()函数,而2和3都不执行?
1中test显式调用了。。。
2、3当然不行。
你得看jssdk中保存的是什么。
以上代码会在jssdk中生成一个属性,这个属性的key是
function test(){↵ alert('hello');↵ }
,注意这是个字符串,value是test()
的返回值,也就是undefined
,最终保存的结果是:为什么呢?因为jssdk是个Object,它的key必须是string类型,上面那段代码用一个动态变量
jssdk[test]
来保存,那就会对test做一个类型转换,因为test是个function,所以会调用test.toString()
,结果是个字符串function test(){↵ alert('hello');↵ }
。如果你把1改成
jssdk[test] = test
(注意没有括号),那第二个就应该可以执行(当然第二个还得改成函数调用),但是第三个怎么搞都没法执行,因为jssdk中压根没有test这个成员函数。