js中属性点.和中括号[]的关系。

本来这里说的是 js 执行一个字符串形式函数的方法。

但是呢看到一个 window['test'] ,居然一下子转不过弯来。这就尴尬了。 

不是说好了 [] 和 . 其他都是 “什么的什么” 关系吗?如 'window.onload' ,表示 window 的加载事件。

使用 function fn(){} 定义了一个函数,和使用 var fn=function(){} 相同的呢。 那这里的 fn 就相当于 window 下的变量咯。所以是 window['fn'] 。

那问题又来了,为什么是加字符串的 ['fn'] 而不是不加字符串的 [fn] 呢? 不加不报错,返回 undefined 。似乎是一个求定义的变量?那 var fn=function(){} 不是定义了么?

1. 中括号运算符总是能代替点运算符。但点运算符却不一定能全部代替中括号运算符。
2. 中括号运算符可以用字符串变量的内容作为属性名。点运算符不能。

  看来这里的“可以用”得改为“需要用”了。

var a=0;
//undefined
a
//0
window.a
//0
window[a]
//Window {…}
window['a']
//0

3. 中括号运算符可以用纯数字为属性名。点运算符不能。

  这个倒是经常用,使用下标时用。如 arr[0] 。这里不引号 arr[0] 就和加引号的 arr['0'] 相同了。


4. 中括号运算符可以用js的关键字和保留字作为属性名。点运算符不能。

window[window]=1
//1
window.window=2
//2
window[window]
//1
window.window
//Window {}
window[window]
//1

//为什么 window.window=2 都有返回值2了,但 再执行 window.window 时却没有成功?
//另外 window[window] 输入的值还是 1 ,也就是也没有被第一次的 window.window=2 改变。
//请问 window.window=2 去哪了?


 下面把本来的 js 执行字符串形式的函数贴一下。下面的 eval 方法好像很多人不喜欢用,据说是因为安全问题。如果是把 JSON 字符串转为对象什么的, JSON.parse(''{"left":100}'') 是经常用的。

<SCRIPT LANGUAGE="JavaScript"> 
function test(str){ 
  alert(str); 
} 
window['test']('aaaaaaaaaaaaaaaaaaaaa'); 
</SCRIPT>
<SCRIPT LANGUAGE="JavaScript"> 
function test(str){ 
  alert(str); 
} 
eval('test("aaaaaaaaaaaaaaaaaaa")'); 
</SCRIPT>

再上两个例子。

function func(a){//定义一个待参数的函数
  alert(a);
}
eval('func()');//调用函数不传入参数
eval('func("bcd")');//调用函数,传入参数


var bb = 'function play(){alert("getplay");}';
var ss = bb;
var ex = {getplay:eval("("+ss+")")};
ex.getplay();
原文地址:https://www.cnblogs.com/daysme/p/6532634.html