内容:关于JavaScript中的一些蛋疼的问题以及面试笔试中常见的一些坑爹套路总结javascript
此部份内容持续总结完善中、、、java
1.undefined和null的区别面试
null和undefined的不一样之处:数组
2.坑爹的thisapp
JavaScript中的this,是包含它的函数做为方法被调用时所属的对象函数
1 var o = { 2 foo: 1, 3 bar: function(){ 4 return this.foo 5 } 6 } 7 8 o.bar() 9 // 1 10 11 var a = o.bar 12 a() 13 // undefined
以上代码两种输出结果是由this的动态做用域致使的,第一次输出时里面的this是对象o,第二次输出时里面的this是对象window(全局对象)this
固然可使用bind方法绑定做用域:spa
1 var o = { 2 foo: 1, 3 bar: function(){ 4 return this.foo 5 } 6 } 7 8 o.bar() 9 // 1 10 11 var a = o.bar 12 a() 13 // undefined 14 15 var b = o.bar.bind(o) 16 b() 17 // 1 18 o.foo = 12 19 b() 20 // 12
3.bind apply call指针
(1)介绍code
在JavaScript中,call
、apply
和bind
是Function
对象自带的三个方法,这三个方法的主要做用是改变函数中的this
指向
bind apply call方法的共同点和区别:
bind
是返回对应函数,便于稍后调用;apply
、call
则是当即调用
(2)bind
bind
方法会建立一个新函数,称为绑定函数,当调用这个绑定函数时,绑定函数会以建立它时传入 bind
方法的第一个参数做为 this
,传入 bind
方法的第二个以及之后的参数加上绑定函数运行时自己的参数按照顺序做为原函数的参数来调用原函数
注意:bind
方法的返回值是函数
1 // bind()最简单的用法是建立一个函数,使这个函数不论怎么调用都有一样的this值 2 // 常见的错误: 将方法从对象中拿出来赋值给变量而后调用,并但愿this指向原来的对象 可是实际上此时this指向全局对象window 3 // 这样若是不作特殊处理,通常会丢失原来的对象 4 // 可是使用bind()方法可以很漂亮的解决这个问题: 5 6 this.num = 9; 7 var module = { 8 num: 81, 9 getNum: function() { return this.num; } 10 }; 11 12 module.getNum(); // 81 13 14 var getNum = module.getNum; 15 getNum(); // 9, 由于在这个例子中,"this"指向全局对象 16 17 // 建立一个'this'绑定到module的函数 18 var boundGetNum = getNum.bind(module); 19 boundGetNum(); // 81
(3)apply和call
apply方法:
语法:apply([thisObj[,argArray]])
定义:应用某一对象的一个方法,用另外一个对象替换当前对象,注意apply方法第二个参数必须是数组或arguments对象
call方法:
语法:call([thisObj[,arg1[, arg2[, [,.argN]]]]])
定义:调用一个对象的一个方法,以另外一个对象替换当前对象。
说明: call
方法能够用来代替另外一个对象调用一个方法。call
方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象
call 和 apply的区别:
对于 apply、call 两者而言,做用彻底同样,只是接受参数的方式不太同样。call
须要把参数按顺序传递进去,而 apply
则是把参数放在数组里。
既然二者功能同样,那该用哪一个呢?在JavaScript 中,某个函数的参数数量是不固定的,所以要说适用条件的话,当你的参数是明确知道数量时用 call ;而不肯定的时候用 apply,而后把参数 push 进数组传递进去。当参数数量不肯定时,函数内部也能够经过 arguments 这个数组来遍历全部的参数
call和apply使用实例:
1 // apply 作了两件事情 2 // 1是绑定 this 3 // 2 是把数组参数解开传给函数 4 // console.log.apply(console, arguments) 5 // 调用 log 函数, this 是 cosnole 6 // arguments 是一个数组, 可是做为参数 传递给 log 函数 7 8 // call 和 apply 如出一辙几乎 9 // 区别只在于传递参数的方式 10 console.log.apply(console, [1, 2, 3, 4]) 11 console.log.call(console, 1, 2, 3, 4)