`

JS_作用域

 
阅读更多
  • 每个执行环境(execution context )都有一个与之关联的变量对象(variable object),环境中定义的所有变量和函数都保存在这个对象中。
  • 某个执行环境中的所有代码执行完毕之后,该环境被销毁,保存在其中的变量和函数也随之销毁
  • 每个函数都有自己的执行环境当执行流进入一个函数时,函数的执行环境就会被推入一个环境栈中,而在函数执行完毕之后栈将其执行环境弹出,把控制权交给之前的执行环境。
  • 当代码在一个环境中执行,会创建变量对象的一个作用域链(scope chain).如果执行环境是函数,则将其活动对象(activation object)作为变量对象。活动对象最开始只包含一个变量,即arguments对象。作用域链的下一个变量对象来自包含环境,而再下一个变量对象来自下一个包含环境,一直延续到全局执行环境。
  • 标识符解析是沿着作用域链一级一级搜索标志符的过程,从作用域链的前端开始,然后向后回朔,直到找到标识符为止。
  • 没有块级作用域。使用var声明的变量会自动添加到最接近的环境中,在函数内部,最接近的环境就是函数的局部环境。如果没有使用var 声明,该变量会自动添加到全局环境中。
  • 函数声明有一个重要特性--函数声明提升(function declaration hoisting),即在执行代码之前先读取函数声明。
    person()
    function person() {
    	alert("person");
    }
    teacher()
    var teacher = function() {   //匿名函数(anonymous function)
    	alert("teacher");
    }
     
  • 闭包是指有权访问另一个函数作用域中的变量的啊函数。创建闭包的常见方式就是在一个函数内部创建另一个函数。
  •  function animal(age){
    	var age = age;
    	return age;
    }
     第一次调用animal()时创建一个包含this、arguments、age的活动对象。全局环境的变量对象包括this、animal。在创建animal()函数的时候会创建一个预先包含全局变量对象的作用域链,这个作用域链被保存在内部的[[Scope]]属性中。当调用animal()函数时,会创建一个执行环境,然后通过复制函数的[[Scope]]属性中对象构建起执行环境的作用域链。此后,又有一个活动对象被创建并推入执行环境作用域链的前端。
  • function animal(age) {
    	return function() {
    		document.write("dog age is: " + age);
    	}
    }
    var dog = animal(12);
    dog();
     当匿名函数从animal()返回后,他的作用域链被初始化为包含animal()活动对象和全局变量对象。这样匿名函数就可以访问在animal()所定义的变量。更为重要的是,animal()执行完毕之后其活动对象也不会销毁,因为匿名函数的作用域链仍然引用这个活动能够对象。换句话说,animal()执行完成之后其作用域链会被销毁,但是活动对象仍然保存在内存中;知道匿名函数被销毁,animal()活动对象才会被销毁,eg.
    dog = null; //解除对匿名函数的引用,则animal()函数的活动对象从内存中释放
     
  • function animal() {
    	 var result = new Array();
    	 for(var i = 0;i<5;i++){
    		 result[i]=function(num){
    			 return function(){
    				 document.write("这是第几个呢?: " + num) ;
    				 document.write("<br>");
    			 }
    		 }(i)
    	 }
    	 return result;
    }
    var result = animal();
    for(var i=0;i<result.length;i++){
    	result[i]();
    }
     
  •  this对象是在运行时基于函数的执行环境绑定的:在全局函数中,this等于window,而当函数被作为某个对象的方法调用时,this等于那个对象。不过匿名函数的执行环境具有全局性,因此其this对象通常指向window.
    var name = "window object";
    var obj = {
    	name : "obj object",
    	getName : function() {
    		return function() {
    			document.write("getName: " + this.name);
    		}
    	}
    }
    obj.getName()();
  • 模仿块级作用域
    function animal() {
    	(function() {
    		alert();
    		var i = 12;
    	})()
    	alert(i);   //i是没有定义的,报错
    }
    animal();
      
  • 任何函数中定义的变量都是私有变量,包括函数的参数、局部变量和在函数内部定义的其他函数。
    function Animal() {
    	var age =22;
    	function addAge(){
    		console.log("addAge this : ",this);   //这个this为window
    		age++;
    	}
    	this.publicMethod = function(){
    		console.log("publicMethod this : ",this);   //这个this为Animal
    		addAge();
    		alert(age);
    		return this;
    	}
    }
     var animal = new Animal();
     animal.publicMethod().publicMethod();
     
  • 静态私有变量
    (function() {
    	document.write("匿名函数被调用");
    	var name = ""
    	Person = function(value) {
    		name = value;
    	}
    	Pserson.prototype.getName = function() {
    		document.write("name: " + name);
    	}
    })();
    var p1 = new Person("zhang");
    p1.getName();
    var p2 = new Person("zhao");
    p1.getName();
     

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    javascript变量作用域

    JavaScript 变量作用域详解 JavaScript 变量作用域是基于其特有的作用域链的。在 JavaScript 中,变量作用域是指变量可以被访问和修改的范围。 JavaScript 没有块级作用域,而是基于函数作用域和全局作用域的。 ...

    js变量作用域

    ### JavaScript 变量作用域详解 #### 一、引言 在探讨JavaScript的面向对象特性之前,理解变量作用域的概念至关重要。本篇文章旨在通过一系列示例和解释,帮助读者掌握JavaScript中的变量作用域机制。 #### 二、...

    深化理解javascript作用域其次篇之词法作用域和动态作用域_.docx

    深化理解javascript作用域其次篇之词法作用域和动态作用域_ 深化理解javascript作用域其次篇之词法作用域和动态作用域,是javascript中非常重要的一部分。理解词法作用域和动态作用域对javascript的编程至关重要。...

    第四章示例代码__对象的作用域

    4. **块作用域**:某些语言(如JavaScript)支持在特定代码块(如if语句或for循环)内定义对象。这些对象仅在该代码块内可见,块结束后就会消失。 5. **静态作用域**:静态作用域(也称为词法作用域)是指对象的...

    深入理解JavaScript作用域和作用域链

    JavaScript作用域是编程中至关重要的概念,它规定了变量和函数的可见性及生命周期。JavaScript主要有两种作用域:全局作用域和局部作用域。 全局作用域是指在代码的任何位置都可以访问的变量或函数,这通常包括在最...

    javascript执行环境,作用域理解

    JavaScript 执行环境和作用域的深层次理解 在 JavaScript 中,执行环境和作用域是两个非常重要和基本的概念,理解了这两个概念对于 JavaScript 中很多脚本的运行结果就能明白其中的道理了。执行环境是一个概念,一...

    JavaScript作用域示例详解

    作用域是JavaScript最重要的概念之一,想要学好JavaScript就需要理解JavaScript作用域和作用域链的工作原理。今天这篇文章对JavaScript作用域示例详解的介绍,希望能帮助大家更好的学习JavaScript。 任何程序设计...

    函数的全局和局部作用域和变量-作用域.html

    // 全局作用域:在script之间或者一个独立的js文件 script之间或者一个独立的js文件里的内容区域,在全局作用域中定义的作用域 全局作用域。 在任何位置都可以访问 // 局部变量:在函数作用域之间里的一个或者...

    JavaScript作用域示例详解_.docx

    JavaScript作用域是编程中至关重要的概念,它规定了变量和函数的可见性和生命周期。了解JavaScript作用域对于编写高效、安全的代码至关重要。本篇将详细解释JavaScript作用域的几个核心特性,包括无块级作用域、函数...

    JS的作用域与闭包

    ### JS的作用域与闭包 #### 一、作用域的基础概念 作用域是JavaScript中一个非常核心的概念,它定义了变量的可见性和生命周期。在学习作用域之前,我们需要先了解几个基本概念: - **变量**: 在JavaScript中,...

    JavaScript作用域原理

    JavaScript作用域是编程中至关重要的概念,它定义了变量、函数和对象的可见性和生命周期。在JavaScript中,作用域主要分为两种类型:全局作用域和局部作用域。此外,随着ES6的引入,块级作用域和函数作用域也变得...

    理解Javascript_15_作用域分配与变量访问规则,再送个闭包

    在深入理解JavaScript编程时,作用域分配与变量访问规则是核心概念之一,而闭包则是JavaScript中一个非常重要的特性。本篇文章将详细介绍函数对象、作用域链以及执行上下文之间的关系,并通过代码实例和作用域链的...

    深入理解变量作用域

    本文将从JavaScript权威指南出发,深入探讨变量作用域的相关知识点,包括全局作用域、局部作用域、以及闭包等高级概念。 #### 二、全局作用域与局部作用域 1. **全局作用域** - 定义:在JavaScript中,如果一个...

    JavaScript中作用域链的概念及用途讲解

    JavaScript中的作用域链是编程中一个至关重要的概念,它决定了变量和函数的可访问性以及在不同作用域内的查找顺序。在深入理解作用域链之前,我们首先要了解什么是执行环境和变量对象。 执行环境,简单来说,就是...

    高性能JavaScript_编程_javascript_js_

    2. **作用域和闭包**:了解JavaScript的作用域规则,如何创建和使用闭包,可以帮助开发者更好地管理内存,避免全局变量污染,提高代码复用性。 3. **对象和原型链**:深入理解原型和原型链,包括对象的创建方式、...

    理解JavaScript变量作用域.pdf

    理解JavaScript变量作用域.pdf 本人还有几十本经典javascript书籍以及无数javascript资料,要的加我qq 568094881,本人网址:www.maoshanhai.com

    你不懂JS:作用域与闭.pdf

    《你不懂JS:作用域与闭包》这本书深入讲解了JavaScript中两个核心概念:作用域和闭包。作用域是JavaScript变量和函数定义的可见范围,它决定了代码中哪些部分可以访问特定变量。理解作用域对于编写可维护和高效的...

    05-JavaScript作用域.pdf

    JavaScript作用域是指在JavaScript代码中,变量、常量、对象和函数能够访问的范围。在编程中,变量和函数的使用都受到作用域的限制,决定了它们能够在哪些代码块中被引用。作用域有助于防止变量命名冲突,也使得程序...

    javascript作用域

    讨论javascript作用域,很多人被javascript作用域搞迷糊了,这个应该有用。

Global site tag (gtag.js) - Google Analytics