你不知道的JavaScript(上卷)笔记

你不知道的JavaScript(上卷)笔记

1.块作用域

块作用域是一个用来对之前的最小授权(函数)进行扩展的工具,将代码从函数中隐藏信息扩展为在块中隐藏信息。有以下四种方式创建块作用域。

1.1 with

使用with从对象中创建的作用域仅在with声明中而非外部作用域有效。

var obj={
    a:1,
    b:2,
    c:3
};
with (obj){
    a=2;
    b=3;
    c=4;
}

1.2try/catch(ES3开始)

JavaScript的ES3规范中规定try/catch的catch分句会创建一个块作用域。

 try{
     throw 2;
 }catch(a){
    console.log( a ); // 2
    }
    console.log( a ); // ReferenceError

1.3let关键字

let可以将变量绑定到所在的任意作用域中,通常搭配{}使用,在不明朗的情况下可以为let加上{}显式添加块 作用域来消除隐形块带来的伤害。
使用let的生命不会再块作用域中进行提升

var foo = true;
if (foo) {
let bar = foo * 2;
bar = something( bar );
console.log( bar );
}
console.log( bar ); // ReferenceError</pre>  
<pre>var foo = true;
if (foo) {{//显式方式
let bar = foo * 2;
bar = something( bar );
console.log( bar );
}}
console.log( bar ); // ReferenceError

for循环头部的let声明会让变量在循环过程中不止被声明一次,每次代送都会声明。随后的每个代送都会使用上一个代送结束时的值来初始化这个变量

for(let i=0;i<=5;i++){
    console.log(i);
}
console.log(i);// ReferenceError

1.4const(通常使用来创建常量)

const MY_FAV = 7;
// 输出 7
console.log("my favorite number is: " + MY_FAV);

2.提升

定义:包括变量和函数在内的所有声明都会在任何代码被执行前首先被处理。
提升时要注意函数优先原则

a=2;
var a;
console.log(a);

javascripe引擎处理的正确顺序:

var a;
a=2;
console.log(a);

3.闭包

定义:当函数可以记住并访问所在的词法作用域是,就产生了闭包,及时函数是在当前词法作用域之外执行。

for(var i=1;i<=5;i++){
    (function () {
        var j=i;
        setTimeout(function timer() {
            console.log(j);
        },j*1000)
    })();
}

在创建的作用域中定义变量来存储每次代送的变量值,下面是该种写法的变形

for(var i=1;i<5;i++){
    (function (j) {
        setTimeout(function timer() {
            console.log(j);
        },j*1000);
    })(i);
}

两种形式可以安装预计的语义输出。都是定义更多的块作用域,定义块作用域变量来存储每一次代送的变量。第一种方式雷同处理this指针的情况。

var obj={
    count:0,
    cool:function coolFn() {
        var self=this;
        if(self.count<1){
            setTimeout(function timer() {
                self.count++;
                console.log("awesome?");
            },1000);
        }
    }
};
obj.cool();

杂记

IIFE两种形式

//第一种
(function foo() {
    var a=3;
    console.log(a);
})();
//第二种
(function () {
  var a=3;
  console.log(a);
}())

函数引用和函数的区别

var obj={
    id:"awesome",
    cool:function coolFn() {
        console.log(this.id);
    }
};
var id="not awesome";
obj.cool();
setTimeout(obj.cool(),100);//输出awesome awesome
var obj={
    id:"awesome",
    cool:function coolFn() {
        console.log(this.id);
    }
};
var id="not awesome";
obj.cool();
setTimeout(obj.cool,100);//输出awesome,not awesome

两者只是obj.cool和obj.cool()的区别。一个是函数引用,一个是函数,函数引用在赋值时this绑定丢失了,this被绑定到全局作用域中

end<pre></pre>的使用问题。

<pre>
    for(var i=0;i<=5;i++){
      var j=i;
    }
</pre>

编译器遇到<=中的<会认为这是结束标志。。。。。。。。。

    for(var i=0;i
阅读更多
换一批

没有更多推荐了,返回首页