一些有意思的一面试题

246 阅读1分钟
alert(a)//函数体 
a()//10
var a=3;
function a(){
alert(10)
 }
alert(a)//3
a=6; 
a();//报错
  • var 和函数都会提升到作用于顶端
  • 对于函数名与变量重名的情况,优先选择变量,若变量值无意义选择函数
var a = 20;
var test = {
    a: 40,
    init: function() {
        console.log(this.a);
        function go() {
            //this.a = 60;
            console.log(this.a);
        }
        go.prototype.a = 50;
        return go;
    }
};
var p = test.init();//40
p(); //20
new(test.init())();//40 50
  • this指向谁调用指向谁
  • 构造函数优先级高于原型链
(function () {
    "use strict";
    this.a = 20;
    var test = {
        a: 40,
        init: () => {
            console.log(this.a)
        }
    };
    var res = test.init().bind(undefined);//软绑定不让其他人修改this指向
    res();
})()//Chrome下控制台的代码是运行在eval之中的,你没法对eval函数使用严格模式,需要添加一个闭包

  • 以上代码会报错,因为res是window调用的,严格模式下找不到window,this=>undefined
  • 关于软绑的意义参考:关于js的软绑定
function test(m) {
    m = {v:5}
}
var m = {k: 30}; 
test(m); 
alert(m.v);//报错
  • js函数的参数是按值传递,所以里面的m被指向了一个新的地址,跟外部的m脱离了关系
function joke() {
console.log(1); 
}
(function () { 
if (false) {
    function joke() { console.log(2);}
}
joke(); //Uncaught TypeError: joke is not a function
})();
  • 你不知道的JavaScript中答案为2,这属于早期浏览器函数提升导致的
  • 当前版本会把joke当变量提升到函数作用域最顶端,也就是var joke = undefined;所以自然不是一个函数
    function fn() { 
        console.log(this.length);
    }
    var yideng = {
    length: 5,
    method: function(fn) {
            fn();
            arguments[0](); 
        }
    };
    yideng.method(fn, 1);//0,2
  • 惊了不?为什么window.length === 0?因为window.length等于页面iframe的个数,因为有一个iframe标签就有一个window
  • arguments0;其实是arguments在调用fn,所以输出arguments.length