javascript - js函数作用域

查看:87
本文介绍了javascript - js函数作用域的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

在console中,测试,不知道一下2个函数有什么区别,为什么name打印出来的结果不同?

我理解不了

解决方案

1.首先要了解变量声明和函数声明提前
就是在执行函数时,会先查找函数内的var关键字 和 函数声明,并预编译。

function f(){
    console.log(1);
    var name = 'name';//此处var name 会被提前
    name2 = 'name2';
    function fun(){};//此处函数声明会被提前
    var fun2 = function(){};//此处var fun2 会被提前
}

执行顺序是

function f(){
    function fun(){};
    var name;
    var fun2;
    console.log(1);
    name = 'name';
    name = 'name2';
    fun2 = function(){};
}

就是声明被提前了,而赋值不会。
这是你的第二段程序输出结果不同的原因。

2.然后要了解作用域链的概念,即变量的查找过程,会先查找当前作用域,没有则会向上一级作用域查找;
如:

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

实际执行顺序是

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

在执行console.log(a)时,函数内已经声明了变量a(包括函数形参也属于声明了变量),但是未赋值,所以值为undefined,所以输出undefined;
而如果函数内没有变量a,则会找到外部的a,输出1;


可以系统的看下作用域链,上下文执行环境和预编译。

这篇关于javascript - js函数作用域的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆