企业面试:作用域和函数提升的面试题

// 六道题

/**

* 因为JS没有块级作用域,if里面的foo又是以var形式声明的,所以会被提升上去,

* 被赋值为undefined,之后undefined代表false,所以会进入if语句块,

* foo被赋值为10,所以下面会打印输出10

*/

var foo = 1;

function bar() {

console.log(foo); // undefined

if (!foo) {

var foo = 10;

}

console.log(foo); // 10

}

bar();

// 练习2

/**

* 调用b函数的时候,由于b函数里面的a函数存在函数提升,

* 会提升到最上面,所以第一次打印是function a() 接下来a被赋值为10,

* 但是这个a只是一个函数上下文里面的局部变量,用完之后就会被销毁掉,

* 所以当外部打印a的时候,仍然打印出1

*/

var a = 1;

function b() {

console.log(a); // function a

a = 10;

return;

function a() { }

}

b();

console.log(a); // 1

// 练习3

// 执行fn函数以后,在全局上下文里面会生成一个c,局部环境下面会生成一个b,

// 在fn函数调用完毕之后,b就会被销毁,由于f为true,所以会进入if生成a变量

var f = true;

if (f === true) {

var a = 10;

}

function fn() {

var b = 20;

c = 30;

}

fn();

console.log(a); // 10

console.log(c); // 30

console.log(b); // 报错

// 练习4

/**

* 全局里面首先会存在a和b,值都为3,之后进入IIFE后,首先是执行的b = 5,

* 这个时候就会找到全局的b,将其修改为5,之后是var a = b,

* 这个a就是局部的a,所以全局的a不会受影响。

*/

var a = b = 3;

(function () {

var a = b = 5; // b=5; var a =b;

})()

console.log(a); //3

console.log(b); // 5

// 练习5

/**

* 在下面的foo函数会被提升,接下来第一条代码打印出来就是function foo 接下来foo被赋值为A,

* 所以打印输出为A,之后foo又被赋值为一个函数,所以打印输出为function foo,调用foo,输出B,后面是一样的

*/

console.log(foo); // function foo

var foo = ‘A‘;

console.log(foo);// A

var foo = function () {

console.log(‘B‘);

}

console.log(foo); // function foo

foo();

function foo() {

console.log(‘C‘);

}

console.log(foo);

foo();//B

// 练习 6

/**

* 主要就是要注意b函数里面的var a = 3存在变量提升,所以b函数里面第一个是undefined,

* 接下来依次赋值打印输出,但是由于是局部变量,所以对全局的a不影响

*/

var a = 1;

function b() {

console.log(a); // undefined

a = 2;

console.log(a);// 2

var a = 3;

console.log(a);// 3

}

console.log(a);//1

b();

console.log(a);// 1

原文地址:https://www.cnblogs.com/yeyuyuni/p/11479184.html

时间: 2024-10-13 20:01:45

企业面试:作用域和函数提升的面试题的相关文章

作用域与变量提升的面试题方法总结

前言:下面的方法能快速的解面试题,主要针对=>作用域与变量提升的面试题.并且没有this改变指向的情况 (有错或者不足的地方,随时修改补充) 1.没有参数的时候:看有没有var,或者函数申明(也就是说如果有变量提升,函数体内就变成私有变量了,函数体内修改了不会影响父级.) 有,子集是undefined,也不会找父级,下面修改了(简单和复合类型)都不会影响父级. 没有,子集找不到,会找到父级,下面修改了(简单和复合类型)都会影响父级. 2.有参数的时候:(有传参,函数体内就变成私有变量了,函数体内

Unix/Linux环境C编程入门教程(31) 数学函数带你战胜企业面试

1.函数介绍: abs()acos()asin()atan()atan2()ceil()cos()cosh()exp()frexp()ldexp()log()log10()pow()sin()sinh()sqrt()tan()tanh() abs(计算整型数的绝对值) 相关函数 labs, fabs 表头文件 #include<stdlib.h> 定义函数 int abs (int j) 函数说明 abs()用来计算参数j的绝对值,然后将结果返回. 返回值 返回参数j的绝对值结果. 范例 #i

作用域、变量提升、函数提升、数据类型

一.作用域分类 (作用域范围内定义的变量,整个作用域都可以访问) 1. 全局作用域 使用var声明(或者不严格模式下没有声明)且在函数外定义的变量,其作用域范围是全局的,称其为全局作用域. 2. 函数作用域 使用var声明且在函数内部定义的变量,其作用域范围是整个函数,称其为函数作用域. 3. 块作用域(ES6) 使用let(或者const 常量)声明且在一个花括号(非函数)里面,其作用域范围就是这个花括号以内,称其为块作用域. 二.变量提升 (变量声明会提升至函数或者语句的最前面,位置还在其作

一次阿里面试后对函数本质的理解

一次阿里面试后对函数本质的理解 写在前面 环境:阿里的在线编程系统允许面试官在线考察面试者的编程能力. 考点:编程和理论. 编程:分为技术自驱力.异步操作.编程风格(颗粒小).变量作用域.DOM操作等. 理论:性能优化,浏览器运行机制,协议/标准等 本文侧重于编程,在编程中对函数的运用是写好程序的基础.(参考开发者技能修炼的五个等级中"第二阶梯:Developer,开发工程师""知道了变量.逻辑与函数的意义") 抛出一个问题 如何写一个信号灯?(参考一道关于Prom

js变量提升和函数提升

变量,作为编程语言最基础的部分,每种语言的变量不尽相同,但又大径相庭.大部分编程语言的变量有块级作用域,如if.for.while... 但JavaScript不纯在块级作用域,而是函数作用域,并且有自己独有的特性--变量提升.(ES6新添加的let.const使其可以用块级作用域) 对于函数的变量访问时遵循作用域链的,即当前函数运行时会有一个当前作用域,当饮用某个变量时,会先查找当前作用域内是否存在该变量的定义,如果不存在则根据作用域链向上去查找父函数的作用域,有则拿来使用,没有则继续向上直到

Javascript作用域和变量提升

下面的程序是什么结果? [javascript] view plain copy var foo = 1; function bar() { if (!foo) { var foo = 10; } alert(foo); } bar(); 结果是10: 那么下面这个呢? [javascript] view plain copy var a = 1; function b() { a = 10; return; function a() {} } b(); alert(a); 结果是1. 吓你一跳

深入理解js的变量提升和函数提升

一.变量提升 在ES6之前,JavaScript没有块级作用域(一对花括号{}即为一个块级作用域),只有全局作用域和函数作用域.变量提升即将变量声明提升到它所在作用域的最开始的部分.上个简历的例子如: 1 2 3 4 5 6 7 8 9 10 console.log(global); // undefined var global = 'global'; console.log(global); // global function fn () { console.log(a); // unde

Javascript模式——函数提升 (笔记)

函数提升: 对于所有的变量,无论函数体的何处进行声明,都会在后台被后台被提升到函数顶部.而对于函数同样适用,其原因在于函数只是分配给变量的对象.当使用函数声明时,函数定义也被提升,而不仅仅只是函数声明. function foo(){ alert('global foo'); } function bar (){ alert('global bar'); } function hoistMe(){ console.log(typeof foo); //function 变量foo以及实现都被提升

JavaScript系列文章:变量提升和函数提升

第一篇文章中提到了变量的提升,所以今天就来介绍一下变量提升和函数提升.这个知识点可谓是老生常谈了,不过其中有些细节方面博主很想借此机会,好好总结一下. 今天主要介绍以下几点: 1. 变量提升 2. 函数提升 3. 为什么要进行提升 4. 最佳实践 那么,我们就开始进入主题吧. 1. 变量提升 通常JS引擎会在正式执行之前先进行一次预编译,在这个过程中,首先将变量声明及函数声明提升至当前作用域的顶端,然后进行接下来的处理.(注:当前流行的JS引擎大都对源码进行了编译,由于引擎的不同,编译形式也会有