JavaScript面试大全3

来源:互联网 发布:硬盘恢复数据公司 编辑:程序博客网 时间:2024/04/28 18:00

1、下面的代码会在 console 输出神马?为什么?

(function(){ var a = b = 3;})(); console.log("a defined? " + (typeof a !== 'undefined')); console.log("b defined? " + (typeof b !== 'undefined'));
      这跟变量作用域有关,输出换成下面的:

console.log(b); //3console.log(typeof a); //undefined

      拆解一下自执行函数中的变量赋值:

      b = 3;
      var a = b;

      所以 b 成了全局变量,而 a 是自执行函数的一个局部变量。

2、下面的代码会在 console 输出神马?为什么?

var myObject = { foo: "bar", func: function() { var self = this; console.log("outer func: this.foo = " + this.foo); console.log("outer func: self.foo = " + self.foo); (function() { console.log("inner func: this.foo = " + this.foo); console.log("inner func: self.foo = " + self.foo); }()); }};myObject.func();

       第一个和第二个的输出不难判断,在 ES6 之前,JavaScript 只有函数作用域,所以 func 中的 IIFE 有自己的独立作用域,并且它能访问到外部作用域中的 self,所以第三个输出会报错,因为 this 在可访问到的作用域内是 undefined,第四个输出是 bar。如果你知道闭包,也很容易解决的:

(function(test) { console.log("inner func: this.foo = " + test.foo); //'bar' console.log("inner func: self.foo = " + self.foo);}(self));

如果对闭包不熟悉,可以参考本文:从作用域链谈闭包


3、将 JavaScript 代码包含在一个函数块中有神马意思呢?为什么要这么做?

     换句话说,为什么要用立即执行函数表达式(Immediately-Invoked Function Expression)。

for(var i = 0; i < 5; i++) { setTimeout(function() { console.log(i);  }, 1000);}

     上面的输出并不是你以为的0,1,2,3,4,而输出的全部是5,这时 IIFE 就能有用了:

for(var i = 0; i < 5; i++) { (function(i) { setTimeout(function() { console.log(i);  }, 1000); })(i)}

     而在 JQuery/Node 的插件和模块开发中,为避免变量污染,也是一个大大的 IIFE:

(function($) {  //代码 } )(jQuery);


4、在严格模式('use strict')下进行 JavaScript 开发有神马好处?

     消除Javascript语法的一些不合理、不严谨之处,减少一些怪异行为;
     消除代码运行的一些不安全之处,保证代码运行的安全;
     提高编译器效率,增加运行速度;
     为未来新版本的Javascript做好铺垫。


5、下面两个函数的返回值是一样的吗?为什么?

function foo1(){ return { bar: "hello" };} function foo2(){ return { bar: "hello" };}

      在编程语言中,基本都是使用分号(;)将语句分隔开,这可以增加代码的可读性和整洁性。而在JS中,如若语句各占独立一行,通常可以省略语句间的分号(;),JS 解析器会根据能否正常编译来决定是否自动填充分号:

var test = 1 + 2console.log(test); //3

      在上述情况下,为了正确解析代码,就不会自动填充分号了,但是对于 return 、break、continue 等语句,如果后面紧跟换行,解析器一定会自动在后面填充分号(;),所以上面的第二个函数就变成了这样:

function foo2(){ return; { bar: "hello" };}

所以第二个函数是返回 undefined。


可以扫一扫,关注微信公众号看文章,谢谢!


 










0 0
原创粉丝点击