1.包括变量定义提升、this指针指向、运算符优先级、原型、继承、全局变量污染、对象属性及原型属性优先级等等。
function Foo() {
getName = function () { alert (1); };
return this;
}
Foo.getName = function () { alert (2);};
Foo.prototype.getName = function () { alert (3);};
var getName = function () { alert (4);};
function getName() { alert (5);}
//请写出以下输出结果:
Foo.getName();//2
getName();//4
Foo().getName();//1
getName();//1
new Foo.getName();//2
new Foo().getName();//3
new new Foo().getName();//3
变形
function Foo() {
this.getName = function () {
alert(1);
}; //这里变了 加了this
return this;
}
Foo.getName = function () {
alert(2);
};
Foo.prototype.getName = function () {
alert(3);
};
var getName = function () {
alert(4);
};
function getName() {
alert(5);
}
//请写出以下输出结果:
Foo.getName(); //2
getName(); //4
Foo().getName(); //1
getName(); //1
new Foo.getName(); //2
new Foo().getName(); //1
new new Foo().getName(); //1
参考题解:
Foo,getName题解分析
天空003
函数中嵌套函数
var length = 10;
function fn(){
console.log(this.length);
}
var obj = {
length:5,
method:function(fn){
fn(); //10
arguments[0](); //2
}
};
obj.method(fn,1);
1.fn()知识点:任意函数里如果嵌套了 非箭头函数,那这个时候,嵌套函数里的 this 在未指定的情况下,应该指向的是 window 对象,所以这里执行 fn 会打印 window.length,但是 let 声明变量时会形成块级作用于,且不存在变量提升,而 var 存在声明提升。所以当使用 let 声明变量时,length 属性实际上并没有添加到 window 对象中。
2.argumengs0 知识点:在方法调用(如果某个对象的属性是函数,这个属性就叫方法,调用这个属性,就叫方法调用)中,执行函数体的时候,作为属性访问主体的对象和数组便是其调用方法内 this 的指向。(通俗的说,调用谁的方法 this 就指向谁)
这里 arguments0 是作为 arguments 对象的属性 [0] 来调用 fn 的,所以 fn 中的 this 指向属性访问主体的对象 arguments
参考:*每日一题(三七)let length = 10 function fn(){ console.log(this.length) } var obj = { length:5,
[‘1‘,‘2‘,‘3‘].map(parseInt)结果讲解
[‘1‘,‘2‘,‘3‘].map(parseInt)结果讲解
[] ==![] 为true
作用域链
inner = 'window';
function say() {
console.log(inner);
console.log(this.inner);
}
var obj1 = (function() {
var inner = '1-1';
return {
inner: '1-2',
say: function() {
console.log(inner);
console.log(this.inner);
}
}
})();
var obj2 = (function() {
var inner = '2-1';
return {
inner: '2-2',
say: function() {
console.log(inner);
console.log(this.inner);
}
}
})();
var obj3 = (function() {
var inner = '3-1';
return {
inner: '3-2',
say: () => {
console.log(inner);
console.log(this.inner);
}
}
})()
say();
obj1.say();
obj2.say();
obj3.say();
obj1.say = say;
obj1.say();
obj1.say = obj2.say;
obj1.say();
Object.create(null) 和{}的区别
1.通过 Object.create(null) 创建的对象是不继承Object原型链上的属性,如tostring()方法这些
var obj = Object.create(null