基础知识回顾——js作用域

1.对js作用域的理解。

  作用域

  作用域分为全局作用域和函数作用域,我们可以理解为变量的生存环境(空间)。全局作用域包含函数作用域,函数作用域里的变量可以访问到全局作用域中的变量,但是反之则不行。

  变量提升

  在js作用域中还有变量提升的现象(只有var 声明的变量才会有变量提升,window声明的不会),赋值语句最后生效。当我定义一个变量,如果它没有被赋值,它是属于undefined;

  变量提升的优先级

  函数声明 > 函数形参(函数的形参属于函数作用域;) > 自定义变量

  延长作用域,闭包(return function(){alert(...);})

  闭包核心思想:函数调用时,在该函数被声明的地方,通过作用域一层一层往外找;

  

1)

  window.a = 1;

  var a = 2; //全局作用域

  function test() {

    var a = 3; //函数作用域

    alert(a);

  }

  alert(a);

如上所示,alert(a)中的a变量寻找的顺序是 函数作用域—全局作用域,在test函数内部找到了,则弹出值为3;第二个alert,在全局作用域中寻找a,弹出值为2;

2)

  var a = 2;

  function test2() {

    //var a;

    alert(a);

    var a = 4;

  }

  对于test函数内部,存在声明的变量a,但是a的赋值操作在alert函数后面。则考虑在执行函数时,会在函数头部首先声明该函数内部使用到的所有变量,且不会被赋值。所以弹出值为undifined;

3)

  function test3(a) {

    //function a(){};  //同样提升到函数头部的变量,因为变量名相同,按照优先级的关系,alert的弹出值为函数a的函数体;

    //a = 7;

    //var a;

    alert(a);

    var a = 5;

    function a() {

    }

  }

  test3(7);

4)

  var obj = {

    name:‘aoao‘,

    getName:function() {

      alert(this.name);

    }

  }

  obj.getName(); //1

  var test5 = obj.getName;

  test5();//2

  注意比较标注1与标注2的区别;

  对于标注1:函数getName在obj内部声明,调用时this指向obj这个对象;

  对于标注2:函数getName的函数体赋值给了test5这个变量,相当于是:

   var test5 = function() {

     alert(this.name);

   }

  注意!此时函数声明在window对象下,this指向window对象;

5)(声明函数与函数表达式的区别)

  //function name() {alert(3);};

  name();

  function name() {alert(3);}

  与

  //var name;

  name2();

  var name2 = function() {alert(2);};

  声明函数会把整个函数声明放到头部,函数表达式会把其函数名的变量提升到头部,因此使用声明函数更加安全;

时间: 2024-10-09 19:55:33

基础知识回顾——js作用域的相关文章

JS基础知识回顾:变量、作用域和内存问题

ECMAScript变量可能包含两种不同数据类型的值:基本类型值和引用类型值. 基本类型值指的是简单的数据段,而引用类型值指的是那些可能由多个值构成的对象. 引用类型的值是保存在内存中的对象,与其他语言不同,JavaScript不允许直接访问内存中的位置,也就是说不能直接操作对象的内存空间. 在操作对象时,实际上是在操作对象的引用而不是实际的对象. 在很多语言中,字符串以对象的形式来表示,因此被认为是引用类型的,ECMAScript放弃了这一传统. 定义基本类型值和引用类型值的方式是类似的:创建

JS基础知识回顾:引用类型(一)

在ECMAScript中引用类型是一种数据结构,用于将数据和功能组织在一起,而对象时引用类型的一个实例. 尽管ECMAScript从技术上讲是一门面向对象的语言,但它不具备传统的面向对象语言所支持的类和接口等基本结构,所以虽然说引用类型与类看起来想死,但他们并不是相同的概念. 不过引用类型有的时候也可以被称为对象定义,因为他们描述的是一类对象所具有的属性和方法. 新对象是使用new操作符后跟一个构造函数来实现的,构造函数本身就是一个函数,只不过该函数时处于创建新对象的目的而定义的. ECMASc

JS基础知识回顾:ECMAScript的语法(一)

任何语言的核心都必然会描述这门语言最基本的工作原理,而描述的内容通常都要涉及这门语言的语法.操作符.数据类型.内置功能等用于构建复杂解决方案的基本概念. ECMAScript中的一切变量.函数名.操作符都区分大小写. ECMAScript的标识符要符合下列规则:第一个字符必须是字母.下划线或美元符号:其他字符可以是字母.下划线.美元符号或数字. 标识符中的字母也可以包含扩展的ASCII或Unicode字母字符,但是并不推荐. 按照惯例,ECMAScript标识符采用驼峰大小写的格式来书写,尽管没

JS基础知识回顾:引用类型(四)

每个函数都是Function类型的实例,而且都与其他引用类型一样具有属性和方法. 由于函数是对象,因此函数名实际上也是一个指向函数对象的指针,不会与某个函数绑定. 函数的声明有以下三种形式: function sum(num1,num2){return num1+num2;}//利用函数声明语法定义 var sum=function(num1,num2){return num1+num2;}//利用函数表达式定义 var sum=new Function("num1","nu

JS基础知识回顾:引用类型(六)

ECMA-262对内置对象的定义是:由ECMAScript实现提供的.不依赖于宿主环境的对象,这些对象在ECMAScript程序执行之前就已经存在了. 开发人员不必显式的实例化内置对象,因为他们已经实例化了. 前面我们已经介绍了大多数内置对象,如Object.Array.String,ECMA-262还定义了两个单体内置对象:Global和Math. Global对象可以说是ECMAScript中最特别的一个对象了,因为不管你从什么角度上看,这个对象都是不存在的. 实际上并没有全局变量或全局属性

JS基础知识回顾:在HTML中使用JavaScript

想HTML页面中插入JavaScript的主要方法就是使用<script>元素. HTML4.01当中为<script>元素定义了下列6个属性: language(已废弃):原来用于表示编写代码使用的脚本语言,如JavaScript.JavaScript1.2.VBScript等,由于大多数浏览器会忽略此属性,因此就没有必要再用了: type(可选):可以看成是language的替代属性,表示编写代码使用的脚本语言的内容类型,也被称作MIME类型,在未指定此属性的情况下会被默认为t

JS基础知识回顾:引用类型(二)

ECMAScript中的Date类型是在早期Java中的java.util.Date类基础上构建的. 因此,Date类型使用自UTC(Coordinated Universal Time,国际协调时间)1970年1月1日午夜零点开始经过的毫秒数来保存日期. 在使用这种数据存储格式的条件下,Date类型保存的日期能够精确到1970年1月1日或之后的285616年. 要创建一个日期对象,使用new操作符和Date构造函数即可:var now=new Date(); 在调用Date构造函数而不传递参数

JS基础知识回顾:ECMAScript的语法(三)

ECMA-262描述了一组用于操作数据值的操作符,包括算术操作符.位操作符.关系操作符和相等操作符. ECMAScript操作符的与众不同之处在于,他们能够适用于很多值,例如字符串.数字值.布尔值.甚至是对象. 在将这些操作符应用于对象时,相应的操作符通常都会调用对象的valueOf()和(或)toString()方法,以便取得可以操作的值. 只能操作一个值的操作符叫做一元操作符. 递增和递减操作符直接借鉴自C,各有前置型和后置型两个版本:a++.++a.a--.--a 这四种操作符不仅适用于整

JS基础知识回顾:引用类型(三)

ECMAScript通过RegExp类型来支持正则表达式. 使用类似Perl的语法就可以创建一个正则表达式:var expression=/pattern/flags; 其中模式(pattern)部分可以是任何简单或复杂的正则表达式,可以包含字符类.限定符.分组.向前查找以及反向引用. 每个正则表达式都可以带有一个或多个标志(flags),用以标注正则表达式的行为. 正则表达式的匹配模式只是下列三个标志: g:表示全局(global)模式,即模式将被应用于所有字符串,而非在发现第一个匹配项时立即