1.
var color = 'green'; //全局作用域下
var test4399 = {
color: 'blue',
getColor: function(){
var color = "red";
alert(this.color);
}
}
var getColor = test4399.getColor;
getColor(); //这里的this 指向window
test4399.getColor(); //这里是4399里的
以上 JavaScript 代码执行后, 浏览器 alert 出来的结果分别是
undefined,red
green,blue
undefined,blue
green,undefined
blued,undefined
解析:js中this的用法,this总是指向调用它的对象,倒数第二行的getColor为windows调用的,倒数第一行的getColor是test4399对象调用的. 答案B
2.请问以下JS代码的输出结果会是什么
var a = 'w'
let obj = {
a: 'o',
print: function() {
console.log(this.a);
},
print2: () => {
console.log(this.a);
}
}
let p = obj.print;
let p2 = obj.print2;
obj.print(); //this指向调用者obj这个对象,所以this.a就是obj.a,即为 'o';
obj.print2(); //箭头函数
p();
p2();
o、 undefined、 undefined、undefined
o、 w、 undefined、 undefined
o、 w、 w、 undefined
o、 w、 w、 w
解析:普通函数,this永远指向它的调用者;箭头函数,this指向定义时的上下文
obj.print() ===> obj调用的普通函数,this指向调用者obj这个对象,所以this.a就是obj.a,即为 'o';
obj.print2() ===> obj调用的箭头函数,this指向上下文,即全局作用下的window,所以this.a就是window.a,即为 'w';
let p = obj.print; p() ===> p是在全局作用域下的,p指向了print(){}函数的地址,执行时是在全局作用域下调用的,所以this指向window,this.a就是window.a,即为 'w';
let p2 = obj.print2; p2() ===> 虽然p2是在全局作用域下的,但是p2指向了print2: () => {}箭头函数的地址,所以this指向print2函数定义时的上下文,即window,this.a就是window.a,即为 'w';
所以,最终输出为:'o', 'w', 'w', 'w'
3.执行以下程序,下列选项中,输出结果正确的是()
for(var i = 0;i<2;i++){
setTimeout(function(){console.log(i)},0) ....①
}
for(var i = 0;i<2;i++){
(function(i){
setTimeout(function(){console.log(i);},0) ...②
}(i))
}
①式输出结果为0 1
①式输出结果为1 1
②式输出结果为0 1
②式输出结果为1 1
解析:A.setTimeout是异步的,定时函数被加入执行队列,等(for循环)主程序运行完毕时,此时再调用定时函数,i的值已经变为2,两次的定时函数都会共用i=2这个值,因此打印2个2
B. js的作用域是链式的,当for循环函数内部的子块有引用的时候是不会销毁的。这里运用了闭包,外层 function(i)保持着对i的引用,因此每次 i的值得以保留,每次调用定时函数内层function都有自己的私有变量值。 因此打印 0 1
4.运行以下程序
<script>
var m= 1, j = k = 0;
function add(n) {
return n = n+1;
}
y = add(m);
function add(n) {
return n = n + 3;
}
z = add(m);
</script>
y和z的最终结果为:
2,4
4,4
2,2
报异常
5.请问以下JS代码的输出是?
function father() {
this.num = 935;
this.work = ['read', 'write', 'listen'];
}
function son() {}
son.prototype = new father();
let son1 = new son();
let son2 = new son();
son1.num = 117;
son1.work.pop();
console.log(son2.num);
console.log(son2.work);
117、 ['read', 'write']
935、['read', 'write','listen']
935、 ['read', 'write']
117、['read', 'write','listen']
解析:
function father() {
this.num = 935;
this.work = ['read', 'write', 'listen'];
}
function son() {} son = {}
son.prototype = new father(); //son.prototype={num=935work = ['read', 'write', 'listen']}
let son1 = new son(); son1={}
let son2 = new son();son2={}
son1.num = 117;// son1 = { num: 117 } 这行代码是在赋值
son1.work.pop(); //没有work,去原型中找到并删除最后一个
console.log(son2.num);//去原型中找
console.log(son2.work);//去原型中找
所以选C