常见前端面试题及答案(10)

41.解释下JavaScript中this是如何工作的。

this永远指向函数运行时所在的对象,而不是函数被创建时所在的对象。匿名函数或不处于任何对象中的函数指向window 。

1.如果是call,apply,with,指定的this是谁,就是谁。

2.普通的函数调用,函数被谁调用,this就是谁。

42.解释下原型继承的原理。

以下代码展示了JS引擎如何查找属性:

function getProperty(obj,prop) {
  if (obj.hasOwnProperty(prop)) {
    return obj[prop];
  } else if (obj.__proto__!==null) {
    return getProperty(obj.__proto__,prop);
  } else {
    return undefined;
  }
}

下图展示的原(prototype)的关联:

43.你是如何测试JavaScript代码的?

结合自己的项目经验进行讲述。(chrome使用技巧

44.AMD vs.CommonJS?

请看文章JavaScript之模块化编程

45.什么是哈希表?

散列表(也叫哈希表),是根据关键码值直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。

46.解释下为什么接下来这段代码不是IIFE(立即调用的函数表达式):function foo(){}();.
•要做哪些改动使它变成IIFE?

因为在解析器解析全局的function或者function内部function关键字的时候,默认是认为function声明,而不是function表达式,如果你不显示告诉编译器,它默认会声明成一个缺少名字的function,并且抛出一个语法错误信息,因为function声明需要一个名字。

var foo = function() {
   // doSomeThing.
 };

foo();

47.描述以下变量的区别:null,undefined或undeclared?

JavaScript的最初版本是这样区分的:null是一个表示"无"的对象,转为数值时为0;undefined是一个表示"无"的原始值,转为数值时为NaN。

但是,上面这样的区分,在实践中很快就被证明不可行。目前,null和undefined基本是同义的,只有一些细微的差别。

null表示"没有对象",即该处不应该有值。典型用法是:
•用来初始化一个变量,这个变量可能被赋值为一个对象。
•用来和一个已经初始化的变量比较,这个变量可以是也可以不是一个对象。
•当函数的参数期望是对象时,被用作参数传入。
•当函数的返回值期望是对象时,被用作返回值传出。