码迷,mamicode.com
首页 > Web开发 > 详细

JS 词法作用域 p2

时间:2019-01-28 21:08:01      阅读:181      评论:0      收藏:0      [点我收藏+]

标签:匹配   严格   console   词法   最好   new   bar   是的   就是   

关于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是错误代码,被禁止~~??

 

JS 词法作用域 p2

标签:匹配   严格   console   词法   最好   new   bar   是的   就是   

原文地址:https://www.cnblogs.com/jony-it/p/10331599.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!