前言:
工作这么久了,还从来没写过博客,发现很多东西都遇到过,但是没去总结,没过多久就给忘记了。也是想借博客能让更多的人少踩坑,自己也能加深印象。下面是自己前段时间出的一份前端面试题附带解析(新手上路,多多关照。不周之处,多多包含)
见js代码:
<
输出结果:
解析:
调用test1()方法输出test1,ECMAScript一个有趣的方面(也是大多数程序设计语言的主要区分),在使用变量之前可不用声明;ECMAScript的解释程序遇到未声明过的标识符时,用该变量创建一个全局变量,并将其初始化为指定的值。故test1()方法中的无var声明变量name为全局变量,调用结果为test1;不过如果不能紧密跟踪变量,这样做也是很危险。最好的习惯时享使用其他程序设计语言一样,总是声明所有变量。
解析:
调用test1()方法时,声明了一个全局变量name,故test2()方法第一处输出的name为test1()方法声明的全局变量name输出为test1,第二处因已给这个全局变量重赋值故输出test2;
解析:
调用test3()方法时,注意有修饰符this,js中的this是谁调用指向谁,当前test3()方法作为方法被调用,相当于window.test3()。那么test3()方法中的第一处输出this.name指向的则是window对象中的全局属性name,输出为test2;第二处因出于js中的变量提示,每次会在当前作用域的最顶部进行声明并没有赋值,输出undefined(参考下处例子);
例:
function test() {
console.log(name); //undefined
var name = "test"
}
实际上以上代码,是按以下顺序来执行的:
function test() {
var name;//js声明变量,会在当前作用域的最顶部声明该属性,但并没有赋值。其默认值为undefined
console.log(name); //输出默认值undefined
name = "test";//此时进行赋值
console.log(name); //输出test
}