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