5个典型的JavaScript面试题

2017-01-19  本文已影响0人  Michael_lpf

原文在这里。我写下来只是为了作个人笔记。


(function(){
var a = b = 5;
})()
console.log(b);

结果:5
代码有两个陷阱:
一,看上去是闭包空间内声明两个变量 a、b, 但事实是:a是匿名函数内用 var 声明的一个变量,而 b 不是。
b 被看做是一个全局变量,并在这个匿名函数内被赋值5,所以在函数外尝试对 b 取值是可行的, 但 a 不行。
二,并没有使用严格模式 'use strict',在严格模式下,会报错,因为严格模式要求显示调用全局变量:

(function(){
var a = window.b = 5;
})()
console.log(b);

String.prototype.repeatify = String.prototype.repeatify || String.prototype.repeatify = function(num){
  var str = '';
  for (var i = 0; i < num; i++){
    str += str;
  }
  return str;
}

这题检测我们原型方面的知识,也检测我们能否扩展内置数据类型方法。


function test(){
  console.log(a);
  console.log(foo());
  var a = 1;
  function foo(){
    return 2;
  }
}
test();

结果:undefined,2。
变量 a 和函数 foo 的声明都能被提升至外部函数 test 的顶部。
但此时的变量 a 并没有被赋值,也就是变量声明被提升,但赋值不会被提升。也就相当于 var a 声明在 console.log(a) 之前,但 a = 1赋值在 console.log(a) 之后。上面代码相当于:

function test(){
  var a;
  function foo(){
    return 2;
  }
  console.log(a);
  console.log(foo());
  a = 1;
}
test();

var name = 'Tom';
var obj = {
  name: 'Jerry',
  prop: {
    name: 'Kitty',
    getName: function(){
      return this.name;
    }
  }
}
console.log(obj.prop.getName);
var test = obj.prop.getName;
console.log(test());

结果:Kitty,Tom
JavaScript 中 this 所指代的函数上下文,取决于调用的方式,而不是被定义的方式。
第一个 console.log() 中,getName 被 obj.prop 对象调用,于是返回obj.prop 的 name 属性值。
当 obj.prop.getName 赋值给全局变量 test 时,当前上下文指代全局对象(因为 test 被隐式看作是全局对象的属性),基于此,getName 返回 window 的 name。


[完]

上一篇下一篇

猜你喜欢

热点阅读