「这是我参与2022首次更文挑战的第19天,活动详情查看:2022首次更文挑战」
1.下面代码的执行结果是什么?
function Foo(){}
var f1 = new Foo()
console.log(f1.constructor)
Foo.prototype = {}
var f2 = new Foo()
console.log(f2.constructor)
答案:Foo(){}, Object(){}
解析:需要注意constructor是定义在原型上的东西,所以它会先找到自己的原型,然后再看constructor指向谁。
因此,在没改变原型前new出来的实例f1的constructor指向Foo,改变构造函数的原型后再new出来的对象f2的constructor就是Object(){}
2.下面代码执行结果是什么?
var a = function () {
this.b = 2;
}
a.prototype.b = 20;
b = new a();
console.log(b.b);
var b = 1000;
a();
console.log(this.b)
答案:2,2
解析:b被new出来的时候,里面自己保存了一个b,所以不用去原型上找,即第一个b.b打印出2
当a()执行的时候,由于里面this指向window,所以执行了window.b=2;所以最后全局答应this.b就是window.b,即打印出2
3.下面代码的执行结果是什么
var fn = function a(){
console.log(a)
a = 1;
console.log(a)
}
fn();
console.log(a)
答案:function a(){...} function a(){...} Uncaught ReferenceError: a is not defined
解析:具名函数表达式的特点,函数名可以在函数内部访问,但是无法被修改。
4.下面代码的执行结果是什么?
**
function a() {
console.log(1)
}
function b() {
console.log(2)
}
function c() {
console.log(3)
}
function d() {
console.log(4)
}
false && a();
true || b();
false || c();
true && d();
答案:3 4
解析:主要&&和||运算符的特点,原则是根据前面的真假值来判断是否还要执行后面的表达式
false && a();//&&前面为false后面不会再看,所以这里不执行a()
true || b();//||前面为true后面不会再看,所以这里不执行b()
false || c();//||前面为false后面会再看,所以这里执行c(),打印出3
true && d();//&&前面为true后面会再看,所以这里执行d(),打印出4
5. call和apply函数
(1)call和apply都是Function.prototype上定义的函数,任何一个函数都有call和apply方法
(2)当函数调用和call或apply方法时,call和apply会改变函数里头的this指向,然后执行该函数
(3)call和apply唯一不同在于传参形式,
call第一个参数是this指向,第二个开始分别对应函数的参数,
apply第一个参数也是this指向,第二个参数是数组,数组里头分别对应形参
(4)另外与call和apply相似的函数,bind()。该函数只是绑定函数的this指向,不会立即执行该函数。