函数的this是什么,取决于函数怎么调用!!而不是函数如何定义!!
函数的this是函数的调用时表现的性质,不是函数定义的时候写死的性质!!
1. 函数使用圆括号调用,函数的this就是window对象
1 | function() { |
- 函数function fun() {}的this不要看他怎么定义,要看他怎么调用; 此时函数是fun() 函数名加圆括号直接调用,此时this就是window对象。
2. 函数作为一个对象的方法,对象打点调用,函数的this就是这个对象
对象.函数()
1 | function() { |
- 我们要看清楚函数执行的时候,是怎么执行的!!
- 现在不是圆括号直接执行!!而是一个对象打点调用这个函数执行,所以函数的上下文是obj对象!!!
3. 函数是事件处理函数,函数的this就是触发这个事件的对象
1 | //定义了一个btnEvent,然后把这个btnEvent当做了2个DOM元素的事件处理函数: |
4. 定时器调用函数,上下文是window对象
1 | function fun() { |
1 | //定时器在事件中使用 |
5. 数组中存放的函数,被数组索引之后加圆括号调用,this就是这个数组
1 | function fun() { |
6. call()和apply()
- 这两个函数都是函数的方法,只有函数能够打点调用call()、apply(),表示用指定的上下文执行这个函数。
- 语法: 函数.call(上下文) || 函数.apply(上下文)
- 区别: 体现在参数上。此时我们要执行的fun函数可以接受参数,apply需要用数组体现这些参数,而call必须用逗号隔开,罗列所有参数:
1 | function fun(a,b,c){ |
函数的arguments
- 首先说说什么是arguments.callee。在函数内部,如果想得到函数自身,用this是不可能的。我们必须使用arguments.callee
1
2
3
4
5function fun(){
console.log(arguments.callee === fun); //true
}
fun(); //true,因为arguments.callee就是fun自己
1 | function fun(a,b,c,d,e,f){ |
函数的length是形参列表的长度,就是函数定义的时候写在fun()圆括号里面的字母个数。无视你的实参个数!也就是说:
arguments.callee.length 形参列表的个数。
arguments.length 实参个数,就是调用函数的时候传进来的实参个数。