首页 > javascript函数嵌套运行机制

javascript函数嵌套运行机制

如下代码,对于y(x)这个函数的运行流程或者说背后的嵌套机制怎么理解更好?

是将x函数代入y(f)函数中?那背后的作用流程,传递的是什么以及哪些是可以传递哪些又是无法传递的?

var x = function (){
  console.log(a);
};

function y(f){
  var a = 2;
  f();
}

y(x)

谢谢!


函数的作用域链是在声明的时候就定义了,而不是在调用的时候。什么是作用域链,简单点说:猴哥上树找桃子,第一层没找到,那就再上一层找,直到找到为止,找不到自然会抛出错误。
var a="global scope";//最顶层
var x = function (){
var a="local scope";//第一层
console.log(a);//猴哥
};
function y(f){
var a = 2;
f();
}
y(x);//结果是:local scope
注释掉函数的x的局部变量a,结果是:global scope(猴哥在最顶层找到了);
再换个方式
var a="global scope";
var x = function (){
//a声明提升,没有赋值(undefined),
console.log(a);
var a="local scope";//在这一层赋值了
console.log(a);
};
function y(f){
var a = 2;
f();
}
y(x);
结果是:undefined local scope
变量声明是提升了,但是值留在了原地,第一个console.log()是先打印再给a赋值的,但第二个console.log()就可以打印出a的值:local scope,而不是global scope。


javascript中通过var关键字声明的变量作用域是函数作用域
javascript中通过var关键字声明的变量作用域是函数作用域
javascript中通过var关键字声明的变量作用域是函数作用域

你在y()里面声明的函数在x()里面根本没声明怎么可能能访问到。

建议先把基础知识过一遍。


var x = function (){
  console.log(a);
};

function y(f){
  var a = 2;
  f();
}

y(x) // ReferenceError: a is not defined

js中作用域于为词法作用域,并且变量的作用域只存在于函数体中。也就是一个变量的作用的确定是在JS代码编译阶段生成并附加在函数对象的[[scrope]]内部属性上(外部无法访问),而不是在函数运行时确定~~~

var x = function (){
  console.log(a);
};

对于上面的函数表达式声明赋值来说,声明了一个变量x,这个x的作用的作用域为全局作用域(假设没有外层函数);x指向的匿名函数对象中使用的变量a,因为在当前匿名函数体内没有声明过变量a,那么编译器就设置其作用域为全局作用域,也就是需要使用的到全局作用域下去查找

function y(f){
  var a = 2;
  f();
}

上面代码声明函数对象f,函数体内的变量a的作用域被设定在函数f的作用域中,除了这个函数外层函数无法访问到。并且传入了一个参数f

y(x);

函数对象f被调用,进而调用函数x,在函数x执行时,需要访问变量a;通过前面的分析,我们确定函数x中的变量a需要到全局对象中去寻找,但是没有找到,渣都没有,JS引擎就报错ReferenceError: a is not defined

如果我们代码这样写:

var a=1;
var x = function (){
  console.log(a);
};

function y(f){
  var a = 2;
  f();
}

y(x) // 1;

那么函数x需要访问的变量a在外层函数(全局对象)能找到,就能正确输出~~

记住一点,函数体内变量的作用域是在函数定义的时候就就确定的,而不是运行时~~~


一个函数仅能访问其定义时所处的作用域,而非执行时


js是函数式编程。函数式编程最大的特点有2个,第一个是可以把函数当做形参传入函数,第二个是函数内可以返回函数。你传递x到y中,并在y内调用。其实这就是一个典型的js写法,这个x也可以被叫做回调函数。你可以想想你平时写的浏览器事件机制。


理论的知识我也不懂┐(─__─)┌。

不过,我知道为什么会出现错误:

原因在于x函数定义在全局作用域,所以查找变量的范围限定在全局作用域与自身的局部作用域。

而,你的代码中,变量a定义在函数y的作用内,所以当调用函数x中时查找不到变量a。

还是要说一个注意点:函数只在创建其的作用域内查找变量(js权威指南上说的好像叫做词法作用域……具体你自己了解下哈)

【热门文章】
【热门文章】