this
- 函数预编译过程this–>window
function test(c) {
var a = 123;
function b() {}
}
test(1);
// 预编译的时候生成AO对象:
// AO{
// arguments:[1],
// this:window,
// c:1,
// a:undefined,
// b:function(){}
// }
// 当执行new test();的时候,函数test内部执行了var this = Object.create(test.prototype);
// 将this的指向改变
用函数检测:
function test(){
console.log(this);
}
test();// Window{...}
- 全局作用域里this–>window
- call/apply可以改变函数运行过程中this的指向
- obj.func();func()里面的this指向obj(就是说谁调用的this,this就指向谁)
例1:
// 注意:哪个对象调用的该函数,该函数中的this就指向这个对象
var name = '222';
var a = {
name: '111',
say: function () {
console.log(this.name);
}
}
var fun = a.say;
fun(); // 222
// fun()的调用实际上只执行了以下过程
// var fun = function(){
// console.log(this.name);
// }
// func();
// 所以说此时函数中的this为预编译时候的this,即window对象
a.say(); // 111
// 此时a对象调用的say()所以函数中的this指向a对象,打印的为a对象的name
var b = {
name: '333',
say: function (fun) {
fun();
}
}
b.say(a.say); // 222
// 相当于下面操作:
// b.say(function () {
// console.log(this.name);
// });
// 然后执行函数:
// function (fun) {
// fun();
// }
// 由于函数fun()没有任何对象调用,所以函数里面的this还是window对象
b.say = a.say;
b.say(); // 333
// 相当于:
// b.say = function(){
// console.log(this.name);
// }
// 然后调用say()函数,此时调用say函数的是b对象,所以this指向b对象,打印的是b对象的name
arguments
- arguments.callee:指向函数自身的引用
测试:
function test() {
console.log(arguments.callee);
}
test();
// ƒ test() {
// console.log(arguments.callee);
// }
用法:立即执行函数获取自身引用
var num = (function (n) {
if (n == 1) {
return 1;
}
return n * arguments.callee(n - 1);
})(100);
console.log(num);
- func.caller:指代函数的调用者
function test() {
demo();
}
function demo() {
console.log(demo.caller);
}
test();
// ƒ test() {
// demo();
// }