Skip to content

JS作用域-对象-this指向考题

作用域考题

1. 除了函数外,js是没有块级作用域。
2. 作用域链:内部可以访问外部的变量,但是外部不能访问内部的变量。
	 注意:如果内部有,优先查找到内部,如果内部没有就查找外部的。
3. 注意声明变量是用var还是没有写(window.)
4. 注意:js有变量提升的机制【变量悬挂声明】
5. 优先级:声明变量 > 声明普通函数 > 参数 > 变量提升

面试的时候怎么看:

1. 本层作用域有没有此变量【注意变量提升】
2. 注意:js除了函数外没有块级作用域
3. 普通声明函数是不看写函数的时候顺序

考题一:

function c(){
	var b = 1;
	function a(){
		console.log( b );
		var b = 2;
		console.log( b );
	}
	a();
	console.log( b );
}
c();

考题二:

var name = 'a';
(function(){
	if( typeof name == 'undefined' ){
		var name = 'b';
		console.log('111'+name);
	}else{
		console.log('222'+name);
	}
})()

考题三:

function fun( a ){
	var a = 10;
	function a(){}
	console.log( a );
}
fun( 100 );

JS对象考题

JS对象注意点:

1. 对象是通过new操作符构建出来的,所以对象之间不想等(除了引用外);
2. 对象注意:引用类型(共同一个地址);
3. 对象的key都是字符串类型;
4. 对象如何找属性|方法;
	查找规则:先在对象本身找 ===> 构造函数中找 ===> 对象原型中找 ===> 构造函数原型中找 ===> 对象上一层原型查找

考题一:

 [1,2,3] === [1,2,3]

考题二:

var obj1 = {
	a:'hellow'
}
var obj2 = obj1;
obj2.a = 'world';
console.log(obj1);
(function(){
	console.log(a);
	var a = 1;
})();

考题三:

var a = {}
var b = {
	key:'a'
}
var c = {
	key:'c'
}

a[b] = '123';
a[c] = '456';

console.log( a[b] );

JS作用域+this指向+原型的考题

考题一:https://mp.weixin.qq.com/s/OIP4lPes0TjoI3xqW-0OSg

function Foo() {
    getName = function () {  //注意是全局的window.
        console.log(1)
    }
    return this;
}

Foo.getName = function () {
    console.log(2)
}
Foo.prototype.getName = function () {
    console.log(3)
}
var getName = function () {
    console.log(4)
}
function getName() {
    console.log(5)
}

Foo.getName();    //2  函数本身
getName(); 		  //4  作用域普通变量>函数
Foo().getName();  //1  调用函数里面的Foo 因为没用申明getName 所以函数Foo里面 变成window.getName
getName();		  //1  函数Foo里面 变成window.getName 覆盖了var getName和function getName
new Foo.getName() //2
new Foo().getName();//3  先在对象本身找 ===> 构造函数中找 ===> 对象原型中找 ===> 构造函数原型中找 ===> 对象上一层原型查找
new new Foo().getName() //3

考题二:

var o = {
	a:10,
	b:{
		a:2,
		fn:function(){
			console.log( this.a );
			console.log( this );
		}
	}
}
o.b.fn();

考题三:

window.name = 'ByteDance';
function A(){
	this.name = 123;
}
A.prototype.getA = function(){
	console.log( this );
	return this.name + 1;
}
let a = new A();
let funcA = a.getA;
funcA();  //this代表window

考题四:

var length = 10;
function fn(){
	return this.length + 1;
}
var obj = {
	length:5,
	test1:function(){
		return fn();
	}
}
obj.test2 = fn;
console.log( obj.test1() );
console.log( fn()===obj.test2() );
console.log( obj.test1() == obj.test2() );