最近看了很多人的微博,主要是“追梦子”的微博,总结了一下。希望大家多多指点。
1. 没有new this的指向问题
this的指向在函数创建的时候是决定不了的,在调用的时候才能决定,谁调用的就指向谁
因为this只会指向它的上一级对象
例一:
function a(){ var user = "追梦子"; console.log(this.user); //undefined console.log(this); //Window } a(); // === window.a() var o = {
user:"追梦子",
fn:function(){
console.log(this.user); //追梦子
console.log(this); // Object{...}
}
}
o.fn(); // ===window.o.fn()
var o = { a:10, b:{ a:12, fn:function(){ console.log(this.a); //undefined console.log(this); //window } } } var j = o.b.fn; //j并没有被调用 j(); // === window.j() |
2. new 构造方法
function Fn(){
this.user = "追梦子";
}
var a = new Fn();
console.log(a.user); //追梦子
用了new关键字就是创建一个对象实例,我们这里用变量a创建了一个Fn的实例(相当于复制了一份Fn到对象a里面),此时仅仅只是创建,并没有执行,而调用这个函数Fn的是对象a,那么this指向的自然是对象a
|
this 与return 如果返回值是一个对象,那么this指向的就是那个返回的对象,如果返回值不是一个对象那么this还是指向函数的实例
function fn() { this.user = '追梦子'; return {}; } var a = new fn; console.log(a.user); //undefined |
function fn() { this.user = '追梦子'; return function(){}; } var a = new fn; console.log(a.user); //undefined |
function fn() { this.user = '追梦子'; return 1; } var a = new fn; console.log(a.user); //追梦子 |
function fn() { this.user = '追梦子'; return undefined;//return null } var a = new fn; console.log(a); //fn {user: "追梦子"} |
在浏览器中setTimeout、setInterval和匿名函数执行时的当前对象是全局对象window
apply用于改变函数执行时的当前对象,当无参数时,当前对象为window,有参数时当前对象为该参数
var name = "window"; var someone = { name: "Bob", showName: function(){ alert(this.name); } }; var other = { name: "Tom" }; someone.showName.apply(); //window someone.showName.apply(other); //Tom