js预解析面试题
程序员文章站
2022-03-18 17:01:28
...
js预解析一直是面试的重点,下面是我自己整理的一些预解析的面试题,基本上是由简到难的顺序排列的,每一道题的答案都自己验证过了,并附上了详细的解释,希望能对你有帮助
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<script type="text/javascript">
//01
alert(a);
a = 0; //报错,a is not defined:不带var的变量没有提升
//02
alert(a); //undefined:带var变量预解析时存在提升
var a = 0;
alert(a); //0
//03
alert(a); //函数原样输出:函数和带var的变量重名,带var的变量被忽略
var a = '我是变量';
function a() {
alert('我是函数')
}
alert(a); //我是变量:重新赋值a = '我是变量'
//04
alert(a); //1. 函数原样输出
a++;
alert(a); //2. NaN
var a = '我是变量';
function a() {
alert('我是函数')
}
alert(a) //3. 我是变量
//05
alert(a); //1. undefined
var a = 0;
alert(a); //2. 0
function fn() {
alert(a); //3. undefined
var a = 1;
alert(a); //4. 1
}
fn()
alert(a); //5. 0:因为函数中的a带var,所以没有影响外面的a,如果函数里的a没有带var,运行结果就会不一样了
//06
alert(a); //1. undefined
var a = 0;
alert(a); //2. 0
function fn() {
alert(a); //3. 0:不带var没有提升,函数内没有a,沿着作用域链向上找,找到全局里的a
a = 1;
alert(a); //4. 1
}
fn()
alert(a); //5. 1:函数里的a没有带var,此时先看有没有形参,如果有,相当于在函数里var一个a,
//如果没有形参, 看全局有没有a, 如果有就是修改全局的a, 如果全局没有a, 就在全局增加一个a, 这里就是修改全局的a
//07
alert(a); //1. undefined
var a = 0;
alert(a); //2. 0
function fn() {
alert(a);
a = 1;
alert(a);
} //函数在预解析提升时,如果函数重名,下边的会覆盖掉上边的,所以这函数失效
fn()
function fn() {
alert(a); //3. undefined
var a = 2;
alert(a++); //4. 2:++在前,先赋值后运算,++在后,先运算再赋值,所以这里还是输出0,但a再后面已经变成1
}
alert(a); //5. 0:函数里的a带var,不影响全局的a
// 08
alert(a); //1. 函数本身
var a = 1; //预解析时,变量名与函数名重名,预解析时的 var a = undefined 会被忽略,执行时的 a = 1 不受影响
alert(a); //2. 1
function a() {
alert(2);
} //函数重名,此函数失效
alert(a); //3. 1
var a = 3; //预解析时,变量名与函数名重名,预解析时的 var a = undefined 会被忽略,执行时的 a = 3 不受影响
alert(a); //4. 3
function a() {
alert(4); //函数始终没有被调用,这里应该是一个幌子
}
alert(a); //5. 3
//09
f1();
console.log(c); //4. 9
console.log(b); //5. 9
console.log(a); //报错:a is not defined这道题原本全局的打印顺序是a,b,c,是本人改成的c,b,a
//由于JS报错,后面的代码都不执行,导致全局的c和b都没有打印,可实际上人家是存在的,如果真有这样的顺序,可以简单的做一个说明
function f1() {
var a = b = c = 9;
/*
这个变量的声明可谓暗藏玄机,其实可以把它分解成如下形式,那一下子就搞懂了
var a = 9;
b = 9;
c = 9;
此时,b和c都没有带var,所以按照上面说的,相当于是在全局创建了b和c,而a由于带var,只是在函数中声明的变量,不会影响全局
*/
console.log(a); //1. 9
console.log(b); //2. 9
console.log(c); //3. 9
}
//10
myFun(10, 20); //报错:myFun is not a function, 本人在这道题上踩了两次坑,很无奈
var myFun = function(a, b) {
return a + b;
}
//这个函数定义的方式是:函数表达式定义,在预解析时这个函数不会整体提升,
//只是提升了 var myFun = undefined,此时当函数调用,肯定就会报错
//11
var i = 1;
i = i++; //本来 i 在运算之后应该变成 2 的,但无奈 = 左边是给 i 本身赋值,所以 i 还是 1
var j = i++; //++在后,先运算, j = 1, 后赋值, i = 2
var k = i + ++i * i++; //k = 2 + 3 * 3, i而后变成4
console.log(i, j, k); //4 1 11
var k = i++ + i++ * i++; //k = 4 + 5 * 6, i而后变成7
console.log(i, j, k); //7 1 34
//自增自减运算时,必须格外注意,只要上面有一个地方改变,那结果就完全不一样了
</script>
</body>
</html>
上一篇: 声明变量提升
下一篇: Android中淡入淡出动画
推荐阅读
-
用PHP解析JS escape加密过的数据!
-
jQuery中关于ScrollableGridPlugin.js(固定表头)插件的使用逐步解析
-
js解析与序列化json数据(一)json.stringify()的基本用法_json
-
js中块级作用域以及函数作用域之间有什么区别?(代码解析)
-
浏览器解析js生成的html出现样式问题的解决方法_javascript技巧
-
android h5预加载js和css提升打开速度
-
js/jquery解析json和数组格式的方法详解_javascript技巧
-
js底层基础解析
-
引用 js在IE与FF之间的区别详细解析_javascript技巧
-
javascript - 微信最新的js_sdk录音下载下来的speex文件怎么解析