资讯专栏INFORMATION COLUMN

JavaScript的作用域

aikin / 1781人阅读

摘要:函数的作用域也可被分为全局作用域和局部作用域函数作用域,被定义在指定函数内部的函数被称为局部函数或内部函数。

作用域

变量和函数都有作用域,作用域就是变量和函数可被访问的范围,控制着变量和函数的可见性和生命周期(生命周期指一个事物开始到结束中间那一段时间)
变量的作用域可被分为全局作用域和局部作用域(函数作用域),如果变量是被定义在全局作用域的话,在JavaScript代码中的任何位置都可以访问该变量;如果变量被定义在指定函数内部,在JavaScript代码中只能在该函数内部访问该变量。
函数的作用域也可被分为全局作用域和局部作用域(函数作用域),被定义在指定函数内部的函数被称为局部函数或内部函数。

全局变量

所有函数之外声明的变量,叫全局变量,它可被当前文档中的其他代码所访问

//第一种定义全局变量的方式:
var str="hello web";//定义全局变量str
//在全局作用域访问全局变量str
//输出结果:字符串的hello web
console.log(str);
function fun(){
//在函数作用域访问全局变量str
//输出结果:字符串的hell web
    console.log(str);
}
//调用fun
fun();

//第二种定义全局变量的方式:
function fn(){
    /*定义变量时没有用var关键字,这时的变量时全局的,
    只要没用var声明的默认为全局变量*/
    str1="this is javaScript";
    //输出结果:字符串 this is javaScript
    console.log(str1);
}
fn();
/*在全局作用域访问变量str1,此时同样可以访问到,虽然是定义在函数内部,
但是它并没有用var关键字*/
console.log(str1);//输出结果字符串this is javaScript
局部变量

在函数内部声明的变量,叫做局部变量,因为它只能在该函数内部访问

function fun(){
    //用关键字var定义局部变量str,
    var str="hello,life";
    //在函数作用域访问局部变量str
    console.log(str);//输出结果字符串:hello,life
}
//调用fun函数
fun();
//在全局作用域访问局部变量str
console.log(str);//报错,全局不允许访问函数内部定义的局部变量
声明提前

JavaScript变量的另一种特别之处,可以引用后面声明的变量,而不会引发异常,这一概念成为变量声明提前。JavaScript变量感觉上是被提升到了所有函数和语句之前,然而提升后的变量将返回undefined值,所以即使在使用或引用某个变量之后存在声明和初始化操作,仍得到undefined值

全局变量声明提前

console.log(str);//不报错,但是输出结果:undefined
var str="hello";//定义全局变量str
console.log(str); //输出结果字符串:hello

//上述代码中的第一行输出不会报错,而是输出undefined值,效果等同于下面的代码
var str;//定义全局变量str,但是不初始化值
console.log(str);//不报错,输出结果undefined
str="hello";//对全局变量str进行初始化值
console.log(str);//输出 字符串 hello

局部变量声明提前

定义在局部变量之前,先调用该函数内部的变量,结果不会报错

function fn(){
    console.log(str);//不报错,输出 undefined
    var str="hello";//定义全局变量 str
    console.log(str);//输出字符串 hello
}
fn();
console.log(str);//报错

//上述代码中的第二行输出不会报错,而是输出undefined,效果等同于下面代码
function fn(){
    var str;//定义局部变量str,但未初始化值
    console.log(str);//不报错,输出结果undefined
    str="hello";//定义局部变量 str
    console.log(str);//输出结果字符串 hello
}
按值传递

指将实参变量的值复制一份副本给函数的形参变量,JavaScript中为函数传递参数时,都是按值传递,如果向函数传递的参数是原始类型数据,则在函数中修改参数变量的值,不会影响外部实参的变量

var n=100;//定义全局变量n
function fun(n){//参数变量也属于局部变量
    n++;//修改的是局部变量的n的值
    console.log(n);//输出的是局部变量的n的值
}
fun(n);//按值传递,方法内输出101
console.log(n);//输出全局变量的值 100
全局函数

函数与变量类似,具有全局作用域和函数作用域(局部作用域),与全局变量相似,全局函数是被定义在全局作用域的,任何位置都可以访问或调用该函数

function fun(num1,num2){
    console.log(num1+num2);//输出结果 3
}
fun(1,2);//调用fun同时传入实参1和2
内部函数

一个函数被定义在另一个函数的内部,被称为局部函数或者内部函数,与变量相似,局部函数只能在当前函数内部访问,而不能在全局作用域中被访问

function fun(){//全局函数
    function inner(){//局部函数
        console.log("hello");
    } 
    inner();//调用正常
}
inner();//输出报错

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/96854.html

相关文章

  • JavaScript深入之词法作用和动态作用

    摘要:作用域作用域是指程序源代码中定义变量的区域。采用词法作用域,也就是静态作用域。而与词法作用域相对的是动态作用域,函数的作用域是在函数调用的时候才决定的。前面我们已经说了,采用的是静态作用域,所以这个例子的结果是。 JavaScript深入系列的第二篇,JavaScript采用词法作用域,什么语言采用了动态作用域?两者的区别又是什么?还有一个略难的思考题,快来看看吧。 作用域 作用域是指...

    gclove 评论0 收藏0
  • 理解JavaScript核心知识点:作用

    摘要:也毫不例外,但在中作用域的特性与其他高级语言稍有不同,这是很多学习者久久难以理清的一个核心知识点。主要使用的是函数作用域。 关于作用域:About Scope 作用域是程序设计里的基础特性,是作用域使得程序运行时可以使用变量存储值、记录和改变程序的状态。JavaScript 也毫不例外,但在 JavaScript 中作用域的特性与其他高级语言稍有不同,这是很多学习者久久难以理清的一个核...

    HelKyle 评论0 收藏0
  • 谈谈javascript语法里一些难点问题(二)

    摘要:讲作用域链首先要从作用域讲起,下面是百度百科里对作用域的定义作用域在许多程序设计语言中非常重要。原文出处谈谈语法里一些难点问题二 3) 作用域链相关的问题 作用域链是javascript语言里非常红的概念,很多学习和使用javascript语言的程序员都知道作用域链是理解javascript里很重要的一些概念的关键,这些概念包括this指针,闭包等等,它非常红的另一个重要原因就...

    Enlightenment 评论0 收藏0
  • 大话javascript 1期:作用作用

    摘要:全局作用域局部作用域局部作用域全局作用域局部作用域块语句没有块级作用域块级声明包括和,以及和循环,和函数不同,它们不会创建新的作用域。局部作用域只在该函数调用执行期间存在。 一、什么是作用域? 作用域是你的代码在运行时,各个变量、函数和对象的可访问性。(可产生作用的区域) 二、JavaScript中的作用域 在 JavaScript 中有两种作用域 全局作用域 局部作用域 当变量定...

    NicolasHe 评论0 收藏0
  • 深入学习js之——词法作用和动态作用

    摘要:在中的应用采用词法作用域,也就是静态作用域。那什么又是词法作用域或者静态作用域呢请继续往下看静态作用域与动态作用域因为采用的是词法作用域函数的作用域在函数定义的时候就决定了。 开篇 当我们在开始学习任何一门语言的时候,都会接触到变量的概念,变量的出现其实是为了解决一个问题,为的是存储某些值,进而,存储某些值的目的是为了在之后对这个值进行访问或者修改,正是这种存储和访问变量的能力将状态给...

    shiweifu 评论0 收藏0
  • JavaScript作用和闭包

    摘要:依然持有对该作用域的引用,而这个引用就叫作闭包。循环和闭包正常情况下,我们对这段代码行为的预期是分别输出数字,每秒一次,每次一个。 一、作用域 作用域共有两种主要的工作模型:第一种是最为普遍的,被大多数编程语言所采用的词法作用域,另外一种叫作动态作用域; JavaScript所采用的作用域模式是词法作用域。 1.词法作用域 词法作用域意味着作用域是由书写代码时函数声明的位置来决定...

    animabear 评论0 收藏0

发表评论

0条评论

aikin

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<