摘要:与执行环境相关的变量对象中有执行环境定义的所有变量和函数作用域链代码在一个环境中执行,便会创建变量对象的一个作用域链。
执行环境
执行环境是什么?
作用域链javascript的解释器每次开始执行一个函数时,都会为每个函数创建一个执行环境(execution context)。
执行环境定义了变量或者函数有权访问的其他数据,决定了他们各自的行为。
与执行环境相关的变量对象(ariable object)中有执行环境定义的所有变量和函数
代码示例代码在一个环境中执行,便会创建变量对象的一个作用域链(scope chain)。
作用域链的作用是,保证对执行环境有权访问的所有变量和函数的有序访问
如果环境是函数,则其活动对象(active object)为环境变量
活动对象最开始含有一个变量,名为arguments对象(该变量全局中不存在)
作用域链的下一个对象来自包含对象,再下一个对象来自下一个包含环境...
标识符的解析是沿着作用域链逐级向上搜索标识符的过程
通过try catch/with 来延长作用域
没有块级作用域(类C的花括号)
var color = "blue"; function changeColor(){ if(color == "blue"){ color = "red"; }else{ color = "blue"; } } changeColor(); alert(color); // red
var color = "blue"; function changeColor(){ var anotherColor = "red"; function swapColor(){ var tempColor = anotherColor; anotherColor = color; color = tempColor; // 能访问 color和anotherColor,tempColor } // 能访问 color和anotherColor swapColor(); alert(color); alert(anotherColor); } // 能访问 color changeColor(); alert(color); alert(anotherColor); //不能被访问到 undefined小结// 函数定义的三种方式 // 函数声明 function sum(num1,num2){ return num1 + num2; } // 函数表达式 var sum = function(num1,num2){ return num1 + num2; }; // 使用Function构造函数 两次代码解析性能慢 不推荐 var sum = new Function("num1","num2","return num1 + num2");
####js 垃圾回收 Garbage Collection(GC) > - javascript具有自动垃圾回收机制 - 两种策略,标记清除和引用计数 - 标记清除(较为常见),第一遍标记所有变量,第二次标记待清除变量 - 引用计数,通过检测变量引用次数的值判定是否变量可以被回收,问题是存在循环引用问题 ####Function 类型 > - 每个函数都是Function类型的实例 - 函数是对象,具有属性和方法,函数名实际上便是指向函数对象的指针 - 函数定义的三种方式 - 函数没有重载,后定义的会覆盖之前的 - 将函数名作为变量进行传参 - 函数的两个内部属性**`arguments`**和**`this`**还有一个**`caller`** - 函数的属性(有个疑问,和内部属性什么区别么),两个`length`(参数个数)和`prototype` - 两个非继承方法`apply()` `call()` ####代码示例 *函数的三种定义方式*// 可以访问sum alert(sum(10,10)); function sum(num1,num2){ return num1 + num2; } // 函数表达式则不行 alert(sum1(10,10)); var sum1 = function(num1,num2){ return num1 + num2; }*函数声明提升(function declaration hositing)*
function callSomeFunction(someFunction,someArgument){ return someFunction(someArgument); } function add10(num1){ return num1 + 10; } var result = callSomeFunction(add10,10); alert(result);这是因为解析器在向执行环境加载数据时候,对于函数声明和函数表达式,解析器会率先读取函数声明,使其在任何代码之前可用(可以访问) *作为值的函数,函数名做为变量进行传参*
function factorial(num){ if(num <= 1){ return 1; }else{ // return num * factorial(num - 1); return num * arguments.callee(num - 1); } } var trueFactorial = factorial; factorial = function(){ return 0; } alert(trueFactorial(5)); // 120 alert(factorial(5)); // 0
*函数的内部属性* arguments对象上一篇笔记提及,类数组对象包含传入函数的所有参数 arguments对象拥有一个名为 `callee`的属性,该属性是一个指针,指向arguments对象的函数 它的作用:window.color = "red"; var o = { color:"blue" }; function sayColor(){ alert(this.color); } sayColor(); o.sayColor = sayColor; // 函数名是指向函数的指针 o.sayColor();`callee`作为指针的用法,解除了函数体内代码和函数名的耦合 **`this`**(很重要,要理解掌握) this引用的是函数据以执行的环境对象或者说是this值(全局作用域调用函数时,this指向的引用就是window)
// apply() call() bind() function sum(num1,num2){ return num1 + num2; } function applySum(num1,num2){ return sum.apply(this,arguments); // 传入arguments // return sum.call(this,[num1,num2]; //或者传入数组 } alert(callSum(10,10)); function callSum(num1,num2){ return sum.call(this,num1,num2); } alert(callSum(10,10));可以通过调试代码,查看当前所在的this指向的环境对象 **疑问:如果window.color 直接写color/var color,不是应该也是指向全局的么,为什么会报undefined** *两个非继承的方法apply() call()*
window.color = "red"; var o = { color:"blue" }; function sayColor(){ alert(this.color); } var objectSayColor = sayColor.bind(o); // bind方法 传入对象o objectSayColor(); sayColor(); sayColor.call(this); sayColor.call(window); sayColor.call(o);*apply()和call() 的作用在于 扩充函数作用域(不明觉厉)*
执行环境的概念
什么是作用域,作用域链的作用
函数是个对象,有相应的属性和方法
前面的哪个疑问 是什么原因?
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/91491.html
摘要:的理解函数与其他语言函数最大的不同在于,其不介意传入多少参数以及参数的类型比如函数的形参有两个,但是调用函数传入的参数可以写一个,三个或不写参数对应等,解析器都可以正常解析,这是因为中参数在内部是以一个数组形式来表示,故而不需要关系传入参数 ECMAScript function的理解 ECMAScript 函数与其他语言函数最大的不同在于,其不介意传入多少参数以及参数的类型...
摘要:元素,当浏览器不支持脚本数据结构有如下中基本数据结构操作符,用来检测给定变量的数据类型结果都是,声明没初始化,使用生命变量但未对其进行初始化的,默认没有进行声明,传递给函数会导致一个错误,对于未声明变量这么操作没什么意义比如,也是返回。 javascript简史 微软IE和网景在浏览器上的竞争 ECMAScript,由ECMA-262定义,提供核心语言功能 `ECMA 欧洲计算机制...
showImg(http://img3.douban.com/lpic/s8958650.jpg); 0x00 javascript组成 ECMAScript(-265)核心语言部分 DOM文档对象模型(DOM1、2、3) BOM浏览器对象模型(提供与浏览器交互的接口和方法) 0x01 async 异步加载 执行顺序不定 charset defer 延迟加载,立即下载脚本但不执行 src ...
摘要:标识符按以下规则组合第一个字符必须是一个字母,下划线或一个美元符号。包含值的变量和尚未定义的变量是不一样的,例子报错然而,对未初始化的变量执行操作符会返回值,对未声明的变量执行操作符统一也会返回值。 1. 语法 1.1 区分大小写 变量、函数名和操作费都区分大小写。 1.2 标识符 标识符指变量、函数、属性的名字,或者函数的参数。标识符按以下规则组合: 第一个字符必须是一个字母,下划线...
摘要:在这种情况下,函数在停止执行后将返回值。这种用法一般用在需要提前停止函数执行而又不需要返回值的情况下严格模式对函数有一些限制不能把函数命名为或不能把参数命名为或不能出现两个命名参数同名的情况。 把近期看高程这本书做的笔记摘录整理出来了,总归对原生javascript理论有了一个比较全面的的认识,这次把书中的一些知识要点摘录出来了,便于以后查阅的时候有方向,也更有效率!! 第一章、jav...
阅读 3432·2023-04-25 18:14
阅读 1525·2021-11-24 09:38
阅读 3243·2021-09-22 14:59
阅读 3059·2021-08-09 13:43
阅读 2561·2019-08-30 15:54
阅读 561·2019-08-30 13:06
阅读 1540·2019-08-30 12:52
阅读 2718·2019-08-30 11:13