JS函数面试题1

function add(n) {
n = n+1;
  }
y = add(x); //2

function add(n) {
n = n + 3;
}
z = add(x); //
//问执行完毕后 x, y, z 的值分别是多少?
//x 1
//y undefined
// z undefined
//函数表达式没有return 所以为undefined

2.

function test(a,b){
console.log(a);//function a(){}
console.log(b);//undefined
var b = 234;
console.log(b);//234
a = 123;
console.log(a);//123
function a() {}
var a;
b = 234;
var b = function(){}
console.log(a);//123
console.log(b);//function(){}
}
test(1);
分析:
(1). 创建AO对象(Activition Object)(执行期上下文)
AO{}
(2). 找形参和变量声明,将变量和形参名名作为AO对象的属性名,值是undefined
AO{
a:undefined,
b:undefined,
}
(3). 将实参和形参统一
AO{
a:1,
b:undefined,
}
(4). 在函数体里面找函数声明,值赋予函数体
AO{
a:function a(){},
b:undefined,
}
(5). 执行语句(解释执行(解释一行、执行一行))
AO{
a:123
b:function(){}
}
4.
var y = ‘global’;
function test(x){
console.log(y);
var y = ‘local’;
return y;
}
console.log(test(true));

输出:undefined
local
注意,当test函数中打印y时,变量y只是被声明了,并没有赋值,所以打印出了undefined;
当程序继续向下执行,输出loca

var y = ‘global’;
function test(x){
(function(){
if(x){
var y = ‘local’;
}
})();
return y;
}
console.log(test(true));

输出:global

var y = 'local’这一句中y的作用域是匿名函数,即this指向Windows,故返回全局变量global

alert(a);
a();
var a = 3;
function a(){
alert(10);
}
alert(a);
a = 6;
a();
输出: function(){}
10
3
报错
首先GO{
a:function
}
后面执行语句(解释执行(解释一行、执行一行))
第一个为a的函数体
执行函数 输出 10
此时a赋值为3 输出a为3
此时a赋值为6 a()不为函数 报错

var a = 20;
function test() {
a = 100;
alert(a);
alert(this.a);
var a;
alert(a);
}
test();
输出: 100
20
100
首先这题是一个关于作用域的题目,函数test是a的一个局部作用域,所以第一输出为100
其次就是关于this的指向问题,这时的this指向Windows,所以输出20
8.
var User = {
  count: 1,
  getCount: function () {
    return this.count;
  }
};
console.log(User.getCount()); // 1
var func = User.getCount;
console.log(func()); // undefined
getCount函数被User对象调用,所以this指向的是User,输出1。
func变量接收的是一个函数体:func()执行的时候, this指的是window, 而window中没有count这个属性。 所以,返回的是undefined。

9.var flag = “window”;
var object = {
flag : “local”,
sayFlag: function(){
//返回一个匿名函数
return function(){
alert(this.flag);
}
}
}
object.sayFlag()();//window
分析: 这时候的this指向的是Windows

function fun(n, o) {
console.log(o)
return {
fun: function (m) {
return fun(m, n);
}
};
}
var a = fun(0);
a.fun(1);
a.fun(2);
a.fun(3);
var b = fun(0).fun(1).fun(2).fun(3);
var c = fun(0).fun(1);
c.fun(2);
c.fun(3);
a,b,c分别输出什么?
所以最终输出的结果为:undifine,0,0,0。
undifine,0,1,2。
undifine,0, 1, 1。
首先第一行,先看var a = fun(0),把0传入fun(n,o)中,那么n=0,o=undifine,
而fun(n,o) return了{fun:function(m){returnfun(m,n);}};,
所以a就等于{fun:function(m){return fun(m,0);}};
所以a.fun(1)=function(1){return fun(1,0);}=fun(1,0),所以会输出0,
同样a.fun(2)=function(2){return fun(2,0);}=fun(2,0),输出0,以此类推,a.fun(3)也输出0。
所以最终输出的结果为:undifine,0,0,0。
再看看第二行,fun(0)输出undifine,fun(0).fun(1)=a.fun(1)=fun(1,0)={fun:function(m){return fun(m,1);}};,输出0,
fun(0).fun(1).fun(2)=function(2){return fun(2,1);}=fun(2,1)={fun:function(m){return fun(m,2);}},输出1,
以此类推,fun(0).fun(1).fun(2).fun(3),
最终按次序输出的是:undifine,0,1,2。
最后看第三行,var c = fun(0).fun(1),根据上面两行的推理,输出的是undifine,0。
c={fun:function(m){return fun(m,1);}},c.fun(2)=function(2){return fun(2,1);},输出1,
c.fun(3)=function(3){return fun(3,1);},输出的还是1,所以第三行输出的是:undifine,0, 1, 1。

### JavaScript闭包函数面试题解析 #### 1. 什么是闭包? 闭包是指一个函数能够记住并访问它的词法作用域,即使这个函数在其词法作用域之外被调用。在JavaScript中,当一个函数嵌套在另一个函数内部时,内部函数可以访问外部函数的变量和参数[^1]。 ```javascript function outerFunction() { let a = 10; return function innerFunction() { console.log(a); // 内部函数访问外部函数的变量a }; } const closure = outerFunction(); closure(); // 输出10 ``` #### 2. 闭包的经典面试题 以下是一些常见的JavaScript闭包面试题: - **问题1**:解释以下代码的输出。 ```javascript function fun() { var count = 1; return function () { count++; console.log(count); } } var fun2 = fun(); fun2(); // 输出2 fun2(); // 输出3 ``` 此代码展示了闭包如何保留对外部变量`count`的引用,并在每次调用`fun2()`时修改它[^1]。 - **问题2**:下面代码的输出是什么? ```javascript function immediateA(a) { function immediateB() { console.log(a); } immediateB(); } immediateA(0); // 输出0 ``` 此代码展示了闭包如何捕获外部函数`immediateA`中的变量`a`,并在`immediateB`中使用它[^4]。 #### 3. 闭包的实际应用场景 闭包在实际开发中有多种用途,例如: - **模拟私有变量**:通过闭包可以在JavaScript中创建私有变量和方法。 ```javascript function createCounter() { let count = 0; return { increment: function () { count++; console.log(count); }, decrement: function () { count--; console.log(count); } }; } const counter = createCounter(); counter.increment(); // 输出1 counter.decrement(); // 输出0 ``` - **数据封装**:闭包可以用来封装数据,避免全局污染。 ```javascript function createStack() { const items = []; return { push(item) { items.push(item); }, pop() { return items.pop(); } }; } const stack = createStack(); stack.push(10); stack.push(5); stack.pop(); // 输出5 ``` 此代码展示了如何使用闭包来封装栈的数据结构,防止直接访问内部数组`items`[^5]。 #### 4. 闭包与垃圾回收 闭包可能导致内存泄漏,因为闭包会持有对外部变量的引用,阻止这些变量被垃圾回收器回收。因此,在使用闭包时需要特别注意资源管理[^3]。 ```javascript function outerFunction() { let a = 1; let b = 2; let c = 3; return function innerFunction() { console.log(a); // 虽然只使用了a,但b和c也会被保留 }; } ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值