call、apply、blind:
- 定义的位置:Function.prototype 函数类的原型上,相对于每个Function的实例来说都是公有方法。
call
- 执行步骤:
- 通过一个Function类的实例来先找到定义在Function.prototype的call
- call方法把这个函数实例中的this修改成了call的第一个参数;(ps:call从第二个参数开始都是传给调用call的函数实例的)
- 函数实例执行(ps:用call的时候,带执行效果)
- 事件中的this修改:
- 严格模式和非严格模式区别:(”use strict” 严格模式,放在script标签下的第一行)
- 使用call的时刻,如果把this修改成null或者undefined时,在非严格模式下会默认this为window
- 自运行函数的this和函数执行前没有”.”,在严格模式下this都是undefined123456789101112div1.onclick = function () {fn.call(document.body);};function fn() {this; //-->body;}////////////////////////////////////////////function sum(num1,num2) {this;return num1+num2;}sum.call(undefined,100,200); //-->在非严格模式下:undefined/null/等,会自动默认this值
- 严格模式和非严格模式区别:(”use strict” 严格模式,放在script标签下的第一行)
apply
和call的方法的作用基本相同,apply的第二个参数是一个数组,会把数组中的每一项作为调用apply方法的函数实例的参数。(和call一样,都是在修改完this之后直接把函数执行了)
1234function sum(a, b) {console.log(a + b);}sum.apply(null, [100, 200])取数组中的最大值
123456789101112Math.max.apply(null,ary);//将数组中的每一项作为参数的时候////////////////////////////////////////////var ary = [1,2,3];console.log(eval("Math.max(" + ary.join() + ")"));///////////////////////////////////////////////////////////////用架设的方法 ——》|var max = ary[0];for (var i = 1; i < ary.length; i++) {if (ary[i] > max) {max = ary[i];}} //循环结束后,max为ary的最大值
blind: 不兼容
- call和apply都已经把函数执行结束,.blind()会返回一个在fn的基础上修改了this的新函数。使用bind的时候,只是修改this,返回值执行的时候再传参,不兼容。
consider
- fn1.call.call.call(fn2):多个call的时候,其实就是第一个参数执行;
Object.prototype.toString.call();
- 相当于call把toString中的this修改成了数组,而原型上方法中的this一般是实例,已经把this更改成了这个数组。那么toString就被数组偷偷的调用了一次。
- Object原型上的toString方法打印”[object Object]”这样的字符串。后半部分就是标记当前实例所属于的类;
- 判断当前数据是不是{}的对象?? –》 “[object Object]”
for in
- hasOwnProperty
- propertyIsEnumerable检查是否为可枚举属性
sort
12345678910ary.sort(function (a, b) {//a,b分别就是数组中要比较的相邻两项return a - b; //return的这个a-b的差就是是否交换位置的依据:若果为整数,则交换位置;mx// return a.age - b.age; 按对象中的某个属性(数字)排序// return a.name.localeCompare(b.name); 字符串排序//"a".localeCompare("b") --》 -1 不变//"a".localeCompare("a") --》0 不变//"a".localeCompare("b") --》1 倒排})
try
|
|