(十八)作用域、作用域链、查找变量案例分析

作用域由创建时候决定的并不是执行时候
  • 案例一:
var x = 10;
function fn(){
	console.log(x);
}
function show(f){
	var x = 20;
	f();
}
show(fn);	//10

  • 案例二:
var fn = function(){
	console.log(fn)
}
fn();//输出是函数本身;局部作用域到全剧作用域查找
  • 案例三:
var obj = {
	fn:function(){
	console.log(fn)//此时fn的作用域中找不到fn;因此到全局中找;但是全局没有;可以改为this.fn或者obj.fn那么就输出这个函数
	}
}
console.log(obj.fn)//undefined;
  • 案例四:
var a = 2;
function fn(){
	console.log(a);
	var a = 3;
}
fn();	//a is undefined

此处存在变量提升;但是变量声明之后并没有直接赋值而是undefined;预处理顺序:声明a;console出a;然后赋值a

var a = 2;
function fn(){
	console.log(a);
	a = 3;	//此时的a是全局变量
}
fn();	//2
  • 案例五:
function b(){}
var b;
console.log(typeof b);	//function

变量先预处理;再是函数预处理

var c = 1;
function c(c){
	console.log(c);
	var c = 3;
}
c(2);	//此处会报错c is not a function;

函数并不会执行整个顺序是:声明变量c;声明函数c;执行变量赋值此时c已经是2;因此执行c(2)会报错。

预处理(代码执行之前):
  • 用var声明的变量
  • 收集用function声明的函数
函数与变量的区别
  • 名=函数 (函数)
  • 名=非函数 (变量)
原文地址:https://www.cnblogs.com/smileyqp/p/12675297.html