ES5、ES6自学笔记( 五 )


bind
bind() 方法不会调用函数 。但是能改变函数内部this 指向
// 3. bind()绑定 捆绑的意思var o = {name: 'andy'};function fn(a, b) {console.log(this);console.log(a + b);};var f = fn.bind(o, 1, 2);f();// 1. 不会调用原来的函数可以改变原来函数内部的this 指向// 2. 返回的是原函数改变this之后产生的新函数// 3. 如果有的函数我们不需要立即调用,但是又想改变这个函数内部的this指向此时用bind// 4. 我们有一个按钮,当我们点击了之后,就禁用这个按钮,3秒钟之后开启这个按钮var btn1 = document.querySelector('button');btn1.onclick = function() {this.disabled = true; // 这个this 指向的是 btn 这个按钮// var that = this; // 原先的写法,使用一个变量接受thissetTimeout(function() {//定时器是window调用的// that.disabled = false; // 定时器函数里面的this 指向的是windowthis.disabled = false; // 此时定时器函数里面的this 指向的是btn}.bind(this), 3000); // 这个this 指向的是btn 这个对象}// 为所有的btn绑定事件var btns = document.querySelectorAll('button');for (var i = 0; i < btns.length; i++) {btns[i].onclick = function () {this.disabled = true;setTimeout(function () {this.disabled = false;}.bind(this), 2000);}}
三者之间的区别call 和 apply 会调用函数, 并且改变函数内部this指向.call 和 apply 传递的参数不一样, call 传递参数 aru1, aru2…形式 apply 必须数组形式[arg]bind 不会调用函数, 可以改变函数内部this指向.call 经常做继承.apply 经常跟数组有关系. 比如借助于数学对象实现数组最大值最小值bind 不调用函数,但是还想改变this指向. 比如改变定时器内部的this指向. 严格模式开启严格模式
严格模式可以应用到整个脚本或个别函数中 。因此在使用时,我们可以将严格模式分为为脚本开启严格模式和为函数开启严格模式两种情况 。
为脚本开启严格模式:
>"use strict";console.log("这是严格模式 。");
因为"use "加了引号,所以老版本的浏览器会把它当作一行普通字符串而忽略 。
>"use strict";// 因为"use strict"加了引号,所以老版本的浏览器会把它当作一行普通字符串而忽略 。console.log("这是严格模式");
有的基本是严格模式,有的脚本是正常模式,这样不利于文件合并,所以可以将整个脚本文件放在一个立即执行的匿名函数之中 。这样独立创建一个作用域而不影响其他脚本文件 。(在函数的第一个语句写‘use ’就是为函数开启严格模式)
>// 将整个脚本文件放在一个立即执行函数里,然后再开启严格模式,独立开启一个作用域,从而不影响其他非严格模式的script文件(function () {'use strict';})();
为函数开启严格模式:
要给某个函数开启严格模式,需要把“use ”; (或 ‘use ’; ) 声明放在函数体所有语句之前 。
>// 此时只是给fn函数开启严格模式function fn() {'use strict';// 下面的代码按照严格模式执行}function fun() {// 里面的还是按照普通模式执行}
严格模式的变化
变量规定
① 在正常模式中,如果一个变量没有声明就赋值,默认是全局变量 。严格模式禁止这种用法,变量都必须先用var 命令声明,然后再使用 。
② 严禁删除已经声明变量 。例如,x; 语法是错误的 。
>(function () {"use strict";// num = 10;// 不使用var创建变量会报错var num = 10;console.log(num);// 报错 Uncaught ReferenceError: num is not defineddelete num;// 报错 Uncaught SyntaxError: Delete of an unqualified identifier in strict mode.})();