作用域

变量提升和块级作用域

扶醉桌前 提交于 2019-12-22 13:42:36
变量提升 JavaScript引擎的工作方式是先解析代码,获取所有被声明的变量,然后一行一行的执行。所有变量的声明语句被提升到代码的头部,这就叫变量提升。 实例1: 1 console.log(a); 2 var a = 1; 以上语句不会报错,只提示 undefined 。 实际运行过程: 1 var a; 2 console.log(a); 3 a = 1; 变量a已经声明,但还未赋值。 变量的提升只会对var命令声明的变量有效,其他不是用var命令声明的变量,不会发生变量的提升。 实例2: 1 console.log(a); 2 a = 1; 以上代码将会报错: ReferenceError: aa is not defined 。 与普通变量一样,js里面的 function 也可看做变量,也存在变量提升的情况: 实例3: 1 a(); 2 function a(){ 3 console.log(1); 4 } 表面上声明之前调用函数a。由于变量提升,函数a定义部分被提升到了代码头部,即调用之前已经声明。 采用赋值语句定义函数会报错 TypeError: a is not a function 。 实例4: 1 a(); 2 var a = function(){ 3 console.log(1); 4 }; 以上代码会报错 TypeError: a is not a

JavaScript 权威指南(4): JavaScript 的作用域和提升

女生的网名这么多〃 提交于 2019-12-22 13:40:14
JavaScript 权威指南(4): JavaScript 的作用域和提升 原文 地址:http://dyy.im/4406.html 你知道下面的 JavaScript 程序执行时会输出什么值吗? var foo = 1; function bar() { if (!foo) { var foo = 10; } alert(foo); } bar(); 答案是“10”,吃惊吗?那么下面的可能会真的让你大吃一惊: var a = 1; function b() { a = 10; return; function a() {} } b(); alert(a); 这里浏览器会弹出“1”。这里发生了什么呢?这似乎看起来是奇怪,未知,让人混淆的,但这实际上是这门语言一个强大和富有表现力的特性。我不知道这一特性行为是否有标准名字,但我喜欢这个术语“提升(hoisting)”。本文试图揭示这一特性的机制,但首先让我们理解 JavaScript 的作用域。 JavaScript中的作用域(scope) JavaScript初学者最容易混淆的地方是作用域。实际上,不只是初学者。我遇到过许多经验丰富的JavaScript程序员,却不完全明白作用域。JavaScript的作用域如此容易混淆的原因是它看起来很像C家族的语言(类C语言)。考虑下面的C程序: #include <stdio.h> int

javascript变量声明提升

删除回忆录丶 提交于 2019-12-22 13:37:06
1.javascript引擎在运行一个js文件时,会把所有的变量声明提升到 当前作用域 的最前面,这叫变量声明提升。 因此,如果在当前作用域中 ,在某变量声明之前访问了该变量,则会返回undifined;而不是直接报错(未定义); 2.不只是变量声明,函数声明也会提升。 这里要注意函数表达式和函数声明的区别。函数表达式不会被提升,而函数声明可以提升。 先看一段代码 var v = "hello"; (function(){ console.log(v); var v = "world"; })(); 这段代码运行的结果是什么呢? 答案是:undefined 这段代码说明了两个问题, 第一,function作用域里的变量v遮盖了上层作用域变量v。代码做少些变动 var v = "hello"; if(true){ console.log(v); var v = "world"; } 输出结果为”hello”,说明 javascript是没有块级作用域的 。 函数是JavaScript中唯一拥有自身作用域的结构。 第二,在function作用域内,变量v的声明被提升了。所以最初的代码相当于: var v = "hello"; (function(){ var v; //declaration hoisting console.log(v); v = "world"; })(); 声明

javascript进阶笔记(1)

做~自己de王妃 提交于 2019-12-22 12:39:04
学习js已经有一段时间了,大大小小还是能够做出一些东西来。不过觉得可惜的是,还是对js本身这门语言不是很熟悉,总有一点雾里看花的感觉,看得见,但是看不清楚。最近发现有一本关于js的叫做《忍者秘籍》的书刊,听说是jQuery作者写的,可以让初级者进阶,哇啦啦,打怪兽,加经验升级,多好的事情。于是,就有了此篇文章及其后续。闲话休谈,正事要紧! javascript是一门函数式语言(functional language)。最重要的,在js中, 函数 是 第一型对象(first-class object) ,也就是说,函数可以共处,可以将其视为其他任意类型的javascript对象。就像普通的js数据类型,函数可以被任意变量进行引用,或声明成对象字面量,甚至可以将其作为函数参数进行传递。 函数的第一型对象体现在: 1、它们可以通过字面量进行创建; 2、它们可以赋值给变量、数组或其他对象的属性; 3、它们可以作为参数传递给函数; 4、它们可以作为函数的返回值进行返回; 5、它们拥有动态创建并赋值的属性。 函数除了以上的功能外,它还包含一个功能,它们可以被调用。千万不要小瞧了函数的调用!因为不同的调用机制会产生不同的功效,特别是针对函数的this关键字。 当我们定义了一个函数,以便其他一些代码在适当的时候回头调用它,我们可以称之为回调。回调是高效利用js必不可少的一部分。

Vue:插槽&作用域插槽

谁都会走 提交于 2019-12-22 11:59:12
1. 具名插槽 在子组件中使用 <slot> 标签定义插槽,父组件可使用 slot 指令替换子组件中的插槽内容。 <!DOCTYPE html> < html > < head > < meta charset = " utf-8 " /> < title > 插槽 </ title > </ head > < body style =" background-color : antiquewhite ; " > < div id = " app " > < cpn > < span slot = " center " style =" color : red ; " > 替换后的中间 </ span > </ cpn > </ div > </ body > < template id = " cpn " > < div > < p > 我是子组件 </ p > < slot name = " left " > < span > 左边 </ span > </ slot > < slot name = " center " > < span > 中间 </ span > </ slot > < slot name = " right " > < span > 右边 </ span > </ slot > </ div > </ template > < script src =

javascript——函数

蓝咒 提交于 2019-12-22 05:43:24
函数的定义和调用 函数定义 1.函数声明方式,使用function关键字,声明命名函数 function fn ( ) { } ; 2.函数表达式定义匿名函数 var func = function ( ) { } ; 3.new Function(‘参数1’,‘参数2’,‘函数体’),参数和函数体要以字符串方式书写,执行效率低,书写麻烦,使用较少,所有函数都是Function的实例对象,函数属于对象 var func = new Function ( 'a' , 'b' , 'console.log(a+b)' ) ; 函数调用 1.普通函数 function fn ( ) { console . log ( '人生巅峰' ) ; } //调用 f ( ) ; //fn.call() 2.对方的方法 var 0 bj = { sayHi : function ( ) { console . log ( '人生巅峰' ) ; } } //调用 obj . sayHi ( ) ; 3.构造函数 function Star ( ) { } ; //调用 new Star ( ) ; 4.绑定事件函数 btn . onclick = function ( ) { } ; //调用 //点击按钮就会调用 5.定时器函数 setInterval ( function ( ) { } ,

python函数嵌套

徘徊边缘 提交于 2019-12-22 04:54:10
1. 函数嵌套:    在一个函数中定义了另外一个函数 def outer():   def inner():     print('inner')   print('outer')   inner() outer() inner() # 此句会出错 函数有可见范围,这就是作用域的概念 内部函数不能被外部直接使用,会抛NameError异常 2. 作用域 一个标识符的可见范围,这就是标识符的作用域。一般常说的是变量的作用域 全局作用域(global):在整个程序运行环境中都可见 局部作用域:在函数、类等内部可见;局部变量使用范围不能超过其所在的局部作用域 def fn1():   x = 1 # 局部作用域,在fn1内可见 def fn2():   print(x) # x可见吗? print(x) # x可见吗? global使用原则:   外部作用域变量会内部作用域可见,但也不要在这个内部的局部作用域中直接使用,因为函数的目的是为了封装,尽量与外界隔离。   如果函数需要使用外部全局变量,请使用函数的形参传参解决。   一句话:不用global,学习它就是为了深入理解变量作用域。 3. 闭包 自由变量 :未在本地作用域中定义的变量。例如定义在内存函数外的外层函数的作用域中的变量。 闭包 :出现在嵌套函数中,指的是内层函数引用到了外层函数的自由变量,就行成了闭包

jsday4笔记

谁都会走 提交于 2019-12-22 01:20:53
函数 为什么要有函数 如果要在多个地方求1-100之间所有数的和,应该怎么做? 概念:当它被调用时执行的可重复使用的代码块。 什么是函数 函数的作用就是封装一段代码,将来可以重复使用。 就是函数,起个名字(函数名),在后续开发中可以反复调用 函数的定义 函数声明式 function 函数名 ( ) { // 函数体 } 函数表达式 var fn = function ( ) { // 函数体 } 特点: 函数声明的时候,函数体并不会执行,只要当函数被调用的时候才会执行。 函数一般都用来干一件事情,需用使用动词+名词,表示做一件事情 tellStory sayHello 等 函数的调用 调用函数的语法: 函数名 ( ) ; 特点: 函数体只有在调用的时候才会执行,调用需要()进行调用。 可以调用多次(重复使用) 代码示例: // 声明函数 function sayHi ( ) { console . log ( "吃了没?" ) ; } // 调用函数 sayHi ( ) ; // 求1-100之间所有数的和 function getSum ( ) { var sum = 0 ; for ( var i = 0 ; i < 100 ; i ++ ) { sum += i ; } console . log ( sum ) ; } // 调用 getSum ( ) ; 函数的参数

Python基础之-----------函数

与世无争的帅哥 提交于 2019-12-21 14:17:43
---恢复内容开始--- 函数: 在其他的语言中,我们也经常听到函数的概念,那么什么是函数呢?在Java中叫做method; 定义: 函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可; 作用: 函数能提高应用的模块性,和代码的重复利用率。 特性: 1、代码一致性,2、代码复用性,3、代码可扩展性; 二: 2.1函数的创建: 在Python中,创建函数要用:def def 函数名(参数列表):   函数体 def hello(): print('hello')hello()#调用hello函数 2.2 函数名的命名规则 : 1、函数名必须是下滑线,字母开头,包含任意字母,下划线,数字,但是不能使用任何的标点符号; 2、函数名是区分大小写的; 3、函数名字不能是保留字; 2.3形式参数,和实参: 形式参数:是不存在的,虚拟的参数,他存在的目的是为了,在函数调用的时候接收实际的参数,形参的个数数据类型应该与实参一一对应; 实际参数:调用函数的传给函数的参数,可以是常量,变量,表达式,函数 传给形参 区别:形式参数是虚拟的不占用内存空间,只有在调用的时候才会分配给内存空间,实参,是具体的,分配内存空间,只有实参传给形参,形参不能传给实参;实参的传递是单向传输的; 2.4:函数的参数: 必备参数; 不定长参数; 默认参数; 关键字参数; 1

Eclipse快捷键大全

南笙酒味 提交于 2019-12-21 06:53:38
Eclipse快捷键大全 Ctrl+1 快速修复(最经典的快捷键,就不用多说了) Ctrl+D: 删除当前行 Ctrl+Alt+↓ 复制当前行到下一行(复制增加) Ctrl+Alt+↑ 复制当前行到上一行(复制增加) Alt+↓ 当前行和下面一行交互位置(特别实用,可以省去先剪切,再粘贴了) Alt+↑ 当前行和上面一行交互位置(同上) Alt+← 前一个编辑的页面 Alt+→ 下一个编辑的页面(当然是针对上面那条来说了) Alt+Enter 显示当前选择资源(工程,or 文件 or文件)的属性 Shift+Enter 在当前行的下一行插入空行(这时鼠标可以在当前行的任一位置,不一定是最后) Shift+Ctrl+Enter 在当前行插入空行(原理同上条) Ctrl+Q 定位到最后编辑的地方 Ctrl+L 定位在某行 (对于程序超过100的人就有福音了) Ctrl+M 最大化当前的Edit或View (再按则反之) Ctrl+/ 注释当前行,再按则取消注释 Ctrl+O 快速显示 OutLine Ctrl+T 快速显示当前类的继承结构 Ctrl+W 关闭当前Editer Ctrl+K 参照选中的Word快速定位到下一个 Ctrl+E 快速显示当前Editer的下拉列表(如果当前页面没有显示的用黑体表示) Ctrl+/(小键盘) 折叠当前类中的所有代码 Ctrl+×(小键盘)