"最新Javascript程序员面试试题和解题方法"
JavaScript面试常常涉及到对语言核心概念的深入理解,如闭包、函数、作用域等。这里我们主要讨论闭包和函数的相关知识。
闭包是一种特殊的机制,它允许内部函数访问并操作其外部函数的变量,即使外部函数已经执行完毕。在提供的代码示例中,`fun` 函数返回了一个新的对象,该对象包含一个内部的 `fun` 函数,这个内部函数引用了外部函数的参数 `n`。当连续调用 `a.fun(1), a.fun(2), a.fun(3)` 时,每次调用都会更新 `n` 的值,而 `o` 的值始终是 undefined,因为没有传入。所以,`a` 的输出序列是 `undefined, 0, 0, 0`。类似地,`b` 和 `c` 的输出可以依次推导出来。
JS中有两种函数:具名函数和匿名函数。具名函数就是函数名被定义的函数,而匿名函数没有显式的名字。通过 `fn.name` 可以检查一个函数是否有名字。在非IE浏览器中,如果函数有名字,`fn.name` 将返回函数名,否则返回 `undefined`。在IE低版本中,可能需要使用兼容性的方法来获取函数名,例如上述的 `getFunctionName` 函数。
创建函数的方式有多种:
1. 函数声明:`function functionName() {}`
2. 函数表达式:`var functionName = function() {}` 或 `var functionName = function anonymous() {}`
3. 立即执行函数表达式 (IIFE):`(function() { /* code */ })()`,这种形式通常用于避免污染全局作用域。
4. 构造函数:`new Function(arg1, arg2, ..., argN, "function body")`,这种方式不常用,但可以在运行时动态创建函数。
函数调用也可以有不同的模式,如:
- 值调用:`myFunction()`,此时函数接收的 `this` 值取决于函数是如何被调用的,通常在非严格模式下是全局对象,在严格模式下是 `undefined`。
- 方法调用:`object.myFunction()`,`this` 指向调用该方法的对象。
- `call` 和 `apply` 调用:`myFunction.call(thisArg, arg1, arg2, ...)`, `myFunction.apply(thisArg, [arg1, arg2, ...])`,可以改变 `this` 的指向并传入参数。
理解这些基础知识对于JavaScript开发者来说至关重要,它们不仅出现在面试中,也是编写高效、可维护代码的基础。