作用域的面试题

本文提供了一系列关于JavaScript作用域和this关键字的面试题目及其解答,深入探讨了变量作用域、函数作用域及this在不同上下文中的行为,帮助读者理解和掌握JavaScript中的关键概念。

作用域面试题:

1.

fn()
function fn () {
console.log(12)
}
var as = function () {
console.log(45)
}

2.

var a = 12;
function fn () {
console.log(a)
var a = 45;
console.log(a)
}
fn()

3.

var a = 12;
function fn () {
console.log(a)
a = 45;
console.log(a)
}
fn()

4.

function fn () {
console.log(11)
function ff () {
console.log(22)
}
ff()
}
fn()

5.

function fn () {
console.log(5)
fn()
}
fn()

6.

function fn () {
console.log(12)
}
var as = fn()
console.log(as)

7.

function fn () {
console.log(12);
return 45;
console.log(456)
}
var as = fn()

8.

var a = 12;
function fn () {
console.log(a);
return 4;
var a = 45;
}
fn()

 9.

var a = 45;
function fn () {
console.log(a)
}
fn()

10.

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

11.

var a = 123;
function fun () {
alert(a);
}
fun()

12.

var a = 123;
function fun () {
alert(a);
var a = 456;
}
fun();
alert(a);

13.

var a = 123;
function fun () {
alert(a);
a = 456;
}
fun()
alert(a)

14.

var a = 123;
function fun (a) {
alert(a)
a = 456;
}
fun()
alert(a)

15.

var a = 123;
function fun (a) {
alert(a)
a = 456
}
fun()
alert(a)
 

16.

function makeNoSense (x) {
this.x = x;
}
makeNoSense(5);
console.log(x);
function test () {
this.x = 1;
alert(this.x);
}
test();
 
 

This的面试题

1.

var name = '222';
var a = {
name : '111',
say : function () {
console.log(this.name)
}
}

var fun = a.say;
fun() //???
a.say() //???

var b = {
name : '333',
say : function (fun) {
fun();
}
}
b.say(a.say); //???
b.say = a.say;
b.say() //???
 

2.

var val = 1
var obj = {
val : 2,
dbl : function() {
var val = 45;
console.log(this); //指向谁?
this.val *= 2;
console.log(this.val); //??
console.log(val); //??
}
}
var fn = obj.dbl
fn()

 

 

3.

var x = 12;
function test() {
console.log(this.x)
}
test() //??

 

4.

var x = 12;
function test() {
console.log(this.x)
}
var obj={
x:45,
ss:test
}
obj.ss() //??

 

5.

var x = 12;
function test() {
console.log(this.x)
}
var obj = {
x:45,
ss:function(){
console.log(this)
test()
}
}
obj.ss() //??

 

6.

var val = 1
var obj = {
val : 2,
dbl : function() {
// var val = 45;
console.log(this); // 指向谁
this.val *= 2;
console.log(this.val); // ???
console.log(val); // ???
}
}
var ff = obj.dbl()

转载于:https://www.cnblogs.com/liancai001/p/10056576.html

### 关于前端开发中的作用域 #### 什么是作用域作用域定义了变量、函数和其他声明的可见性和生命周期范围。JavaScript 中的作用域分为全局作用域和局部作用域(也称为函数作用域或块级作用域)。当访问某个变量时,JavaScript 引擎会按照特定的规则逐层向上查找该变量是否存在。 #### JavaScript 的作用域分类 1. **全局作用域** 当变量被声明在任何函数之外时,它属于全局作用域。这种变量可以在程序的任何地方访问。 2. **函数作用域** 变量如果是在函数内部通过 `var` 或隐式声明,则它们只存在于这个函数内。这是 ES5 和更早版本的主要作用域形式[^1]。 3. **块级作用域** 使用 `let` 和 `const` 声明的变量具有块级作用域,这意味着这些变量仅在其所在的 `{}` 大括号范围内有效。这一特性是从 ES6 开始引入的。 #### 示例代码展示不同作用域的行为 以下是几个例子来说明不同的作用域行为: ```javascript // 全局作用域 var globalVar = "I am a global variable"; function testScope() { var localVar = "I am a local variable"; // 局部作用域 if (true) { let blockScopedVar = "I am block scoped"; // 块级作用域 console.log(blockScopedVar); // 输出: I am block scoped } // 尝试访问块级作用域外的变量 // console.log(blockScopedVar); // 报错:blockScopedVar is not defined console.log(localVar); // 输出: I am a local variable } testScope(); console.log(globalVar); // 输出: I am a global variable // console.log(localVar); // 报错:localVar is not defined ``` #### 闭包与作用域的关系 闭包是指有权访问另一个函数作用域内的变量的函数。创建闭包的一个常见方式是返回一个能够访问其父作用域中变量的嵌套函数。这使得即使外部函数已经执行完毕并退出,内部函数仍然可以保持对外部函数作用域中变量的引用[^2]。 ##### 示例:利用闭包保存状态 ```javascript function createCounter() { let count = 0; // 定义在createCounter函数作用域下的私有变量 return function () { // 返回匿名函数形成闭包 count += 1; return count; }; } const counter = createCounter(); console.log(counter()); // 输出: 1 console.log(counter()); // 输出: 2 ``` #### 面试题举例 基于上述知识点,以下是一些常见的前端开发面试题及其解答思路: 1. **解释下面代码的结果** ```javascript for(var i=0;i<3;i++) { setTimeout(function(){ console.log(i); },1000); } ``` 结果是什么?为什么? 答案:由于 `setTimeout` 是异步操作,在循环结束后才会被执行,此时 `i` 已经变成了最终值 `3`,因此三次都会打印 `3`。可以通过使用立即执行函数表达式(IIFE)或将 `for` 替换为 `let` 来修复这个问题。 2. **如何实现块级作用域?** 答案:ES6 提供了新的关键字 `let` 和 `const`,用于声明块级作用域的变量。相比传统的 `var`,它们不会提升到顶部,并且只能在声明它们的大括号 `{}` 内部访问。 3. **描述一下闭包的概念以及它的实际用途有哪些?** 答案:闭包允许函数记住并访问其词法作用域,即便该函数在其词法作用域之外执行。它可以用来封装数据隐私、模拟类模块模式等场景。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值