logo头像

桃李不言,下自成蹊

JavaScript笔记整理第4篇

关于Javascript中this的指向
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
/**
* 普通函数中的this是 -----window
* 对象.方法中的this是 -----当前的实例对象
* 定时器方法中的this是 -----window
* 构造函数中的this是 ----当前的实例对象
* 原型对象方法中的this是 ----当前的实例对象
*
*
* 那么严格模式中的this指向的是谁呢???
*
* */
"use strict";
function f1() {
console.log(this); //window ???? 严格模式下输出undefined
}
window.f1();


/**
* 函数也是对象,但对象不一定是函数
* 实例对象里有__proto__,下划线原型
* 构造函数里有prototype原型对象
* 所有的对象最终都指向了Object的原型(prototype),Object的原型对象中的下划线的原型指向null
* */
//所有的函数实际上都是Function的构造函数创建出来的实例对象
var f1 = new Function('num1','num2','return num1+num2');
console.log(f1(10,20))//30
关于Javascript中call、apply、bind的使用总结
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
 function f1(x,y) {
console.log('结果是:'+(x+y)+this);
}

console.log('=====');
apply与call也是函数调用的方式
f1.apply(); //NaN[object Window]
f1.call(); //NaN[object Window]
console.log('=====');
f1.apply(null); //NaN[object Window]
f1.call(null); //NaN[object Window]
/**
*
*
* 结论:apply和call方法中如果没有传入参数或者传入的是null。那么调用该方法的函数对象中的this就是默认的window
*
* */



f1.apply(null,[100,200]); //300[object Window]
f1.call(null,100,200); //300[object Window]
/**
*
* 结论:都可以让函数和方法来调用,传入参数和函数自己调用的写法不一样,但是效果一样
*
* */



var obj = {
age:10,
sex:"男"
}
window.f1.apply(obj,[10,20]); //30[object Object]
window.f1.call(obj,10,20); //30[object Object]
console.dir(obj);
/**
*
* 结论:apply和call可以改变this的指向
*/



//f1即是函数也是对象
console.log(f1);

//对象调用方法,说明,该对象中有这个方法
f1.apply();
f1.call();
/**
* 猜想:这两个方法应该在它的实例对象或者原型对象中
* 结论:该方法都在都在它所在的构造函数的原型对象中
*
* */
console.log(f1.__proto__ == Function.prototype) //true
//所有的函数都是Function的实例对象
console.log(Function.prototype); //ƒ () { [native code] }
console.dir(Function) //ƒ Function()

/**
* apply与call方法并不在f1函数这个实例对象中,而是在Function的prototype中
*
* */


/**
bind
*/
function f1(x,y) {
console.log((x+y)+":=======>"+this);
}

//bind相当于复制了一份,
var ff = f1.bind();
ff(); //NaN:=======>[object Window] 此时的this是window


//把参数传入到f1函数中,x====>10,y=====>20 ,null就是this,默认就是window
var ff = f1.bind(null,10,20);
ff(); //30:=======>[object Window]



function f1() {
console.log(":=======>"+this.age);
}

function Person() {
this.age=1000;
}
var p = new Person();
var ff = f1.bind(p,10,20)
ff(); //此时f1函数中的this.age就是p的实例对象的属性的值

/**
* bind方法是复制的意思,参数可以在复制的时候穿进去,也可以在复制之后调用的时候传入进去
* apply和call是在调用的时候改变this指向
* bind是在复制的时候改变this的指向
* 语法:
* 函数名字.bind(对象,参数1,参数2,....)返回值是复制之后的这个函数
*
* */
支付宝打赏 微信打赏

您的支持是对作者最大的肯定