这些经典JS代码运行结果真是让我意想不到

1.

1

2

3

4

5

6

7

8

9

10

11

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代码的输出结果会是什么

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

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.运行以下程序

1

2

3

4

5

6

7

8

9

10

11

<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代码的输出是?

1

2

3

4

5

6

7

8

9

10

11

12

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

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值