JS 词法作用域 p2
关于js 还是写的简短些,利于个人理解:
先看一个例子:
var a = 2; function fn(){ var a = 3; console.log(a); } fn(a);//3
说明:作用域查找会在找到第一个匹配的标识符时停止,也叫做“”遮蔽效应“”
这里很好理解,我们平时用的也很多。还有就是作用域查找只会查看一级标识符,比如foo.bar,只会查找foo,这个也很好理解。
欺骗词法:
也就是动态修改词法作用域。(不推荐,会导致性能下降)
1.eval()
可以接受字符串为参数,将内容看做是在于此处的代码,比如:
function fn(x){ eval(x) } fn(x); // 或者更直接 eval("alert(1)")
是的,你的窗口跳出了1.
刚开始接触的时候就因为eval被老师傅喷过,但是不明白为什么,三年前之前是这样用的,如下:
// 理解为后台传过来的json字符串 eval('{x:"123"}');// 123
用来解析对象,记不清了,好像是这样的,然后。。 就没有然后了。
为什么不好(除了性能之外),看下面这段:
var a = 2 function fn(x){ eval(x); } fn(" a = 3"); console.log(a);
a 变成3了,所以说是很危险的操作,想像一下,你本来定义好的变量,在页面中就被人无缘无故的改了~~~~
当前如果是严格模式情况下,就不会修改了。(把这句忘掉吧,最好不用)
除了他们new FUNCTION(..) 函数也是。
2.with
with可以重复引用同一个对象多个属性:
var b={ a:1, b:2 } with (o){ a = 2, b= 3 }
再来一个例子(书里的):
function fn(o){ with(0){ o.a = 2 } } var o1 = { a:3 } var o2 = { b:2 } foo(o1); console.log(01.a) // 2 foo(o2); console.log(o2.a)//undefined console.log(a)// 2 a被创建到全局作用域
另:在严格模式下,with是错误代码,被禁止~~😄
成灰之前,抓紧时间做点事!!