你不知道的JavaScript(上卷)笔记
2017-01-11 09:31
429 查看
你不知道的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
相关文章推荐
- JQuery1——基础($对象,选择器,对象转换)
- Android学习笔记(二九):嵌入浏览器
- Android java 与 javascript互访(相互调用)的方法例子
- 只需四个步骤几行代码,即可快速实现直播弹幕功能
- JavaScript演示排序算法
- javascript实现10进制转为N进制数
- JavaScript 基础、进阶以及 Ubuntu 系统中的 JavaScript 开发调试工具
- 最后一次说说闭包
- Ajax
- 2019年开发人员应该学习的8个JavaScript框架
- HTML中的script标签研究
- 对一个分号引发的错误研究
- 设计模式---状态模式在web前端中的应用
- 异步流程控制:7 行代码学会 co 模块
- ES6 走马观花(ECMAScript2015 新特性)
- JavaScript拆分字符串时产生空字符的原因
- Canvas 在高清屏下绘制图片变模糊的解决方法