JAVASCRIPPT作用域-函数作用域和声明提前【摘自《Javascript 权威指南》】

一个变量的作用域是程序源代码中定义这个变量的区域。全局变量拥有全局作用域,在JavaScript代码中的任何地方都是有定义的。

然而在函数内声明的变量只在函数体内有定义。他们是局部变量,作用域是局部性的。函数参数也是局部变量,他们只在体内有定义。

在函数体内,局部变量的优先级高于同名的全局变量。如果在函数内声明的一个局部变量或函数参数中带有的变量和全局变量重名,

全局就被局部变量所覆盖。

eg:

var a="aaaa";

(function (){
          var a="bbb";
          console.log(a);

})();

=>   输出 bbbb;

一般的编程语言中,花括号内的每一段代码都具有各自的作用域,在而且变量在声明它们的代码段之外是不可见的。我们称之为块级作用域。
  但在JavaScript中,没有块级作用域。取而代之地使用了函数作用域:变量在声明他们的函数体以及这个函数的嵌套的任何函数体内都是可见的。

eg:

(function test(O){
      var i=0;

if(typeof O =="object"){

var j=0;

for(var k=0; k<10;k++){
                console.log(k); => 0~9

}

console.log(k); =>10

}

console.log(j);=>  0

})({});

由上面例子 可知 函数体内声明的变量在函数体内始终是可见的。  这也意味着变量在声明之前 甚至已经可用了,这有个非正式的称为 函数变量声明提前

时间: 2024-08-27 07:12:17

JAVASCRIPPT作用域-函数作用域和声明提前【摘自《Javascript 权威指南》】的相关文章

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

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;

JavaScript权威指南 - 函数

函数本身就是一段JavaScript代码,定义一次但可能被调用任意次.如果函数挂载在一个对象上,作为对象的一个属性,通常这种函数被称作对象的方法.用于初始化一个新创建的对象的函数被称作构造函数. 相对于其他面向对象语言,在JavaScript中的函数是特殊的,函数即是对象.JavaScript可以把函数赋值给变量,或者作为参数传递给其他函数,甚至可以给它们设置属性等. JavaScript的函数可以嵌套在其他函数中定义,这样定义的函数就可以访问它们外层函数中的任何变量.这也就是所谓的"闭包&qu

JavaScript权威指南第08章 函数

函数 在javascript中,函数是对象,所以可以给函数设置属性,可以调用他们的方法. 8.1函数定义 function 函数名(参数列表){ 语句内容 } 函数命名规则 1.字母之间用下划线 like_this() 2.非首字母的单词首字母大写 likeThis() 嵌套函数 在函数里面定义函数 8.2函数调用 函数调用的4种方法 1.函数 2.方法 3.构造方法 4.apply call 简介调用 8.3函数的实参和形参 8.4作为值的函数 8.5作为命名空间的函数 8.6闭包 8.7函数

变量作用域&amp;函数作用域

一. 变量作用域 1)全局变量 在全局环境下声明的变量被视为全局变量. 在没有使用var进行声明的时候,变量就被定义为全局变量.在ES5的严格模式下,如果变量没有使用var来声明是会报错的. 2)局部变量 在函数体内部声明的变量被视为局部变量.其中涉及到js中的函数作用域问题. 二. 函数作用域 因为js中是没有块级作用域的概念,所谓的块级作用域就是指花括号内的的每一段代码都有其自己的作用域,但js中并不是,例如for循环中定义的变量,外界也可以访问:但是js中有函数作用域的概念,即在每一个函数

《Javascript权威指南》函数

一.函数定义 函数声明语句声明了一个变量,并把一个函数对象赋值给它.定义函数表达式没有声明变量. 如果一个函数定义表达式包含名称,函数的局部作用域会包含一个绑定到函数对象的名称.函数的名称成为函数内部的局部变量. 函数声明语句“被提前”到外部脚本或外部函数作用域顶部,可以在它定义前出现的代码调用.但表达式定义的函数不能. 二.函数调用 1.函数调用 如果函数表达式是一个属性访问表达式,即该函数是一个对象的属性或数组的一个元素,则它是方法调用表达式 2.方法调用 o.m(); 对象o成为调用上下文

JavaScript基础学习之-JavaScript权威指南--8.1-8.4函数

第八章函数 函数是JavaScript中很重要的一个章节,懂得这个章节就可以轻松阅读别人的代码,会熟悉一些不常用的代码写法. 按照难易程度控制文章的长度. 前言: 函数是一段只定义一次,可能被执行或调用任意次的JavaScript代码. 若一个函数挂载在一个对象上,作为对象的属性,称为对象的方法.当通过这个对象来调用函数时,该对象就是此次调用的上下文,函数会隐式自动获得上下文对象. JavaScript中函数即对象,程序可以任意操控. JavaScript的函数可以嵌套在其他函数中定义,这样嵌套

javascript权威指南笔记(第8章 函数)

8.1 函数定义: 变量声明提前,但是变量赋值并不会提前 函数声明语句不能出现在循环,条件判断或者try/catch/finally以及with语句中: 8.2 函数调用(函数调用,方法调用,构造函数调用,间接调用(call,apply)) 1.var isStrict = (function() { return !this; }()); 2.this的指向问题(嵌套函数this的指向问题) 可以解决的方法有:var self = this 或者使用 apply //嵌套函数 var o =

JavaScript基础学习之-javascript权威指南--8.6函数闭包

一.什么是闭包? 官方”的解释是:闭包是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分. 相信很少有人能直接看懂这句话,因为他描述的太学术. 其实这句话通俗的来说就是:JavaScript中所有的function都是一个闭包.不过一般来说,嵌套的function所产生的闭包更为强大,也是大部分时候我们所谓的“闭包”.看下面这段代码: function a() { var i = 0; function b() { alert(++i); } r

201507010852_《Javascript权威指南(第六版)——判断值类型的type函数 、鸭式辩型》(P210-217)

一. 类的扩充 1. 只要扩充原型类,就能动态更新到实例.例如:xxx.prototype.do = function() {//...}; 2. 不建议采用污染JavaScript的方法,如:Object.prototype.methods = function() {//...};   采用<权威指南>9.8.1中的方法添加属性,如:Object.defineProperty(//...); 3. 二. 类和类型 1. isPrototypeOf(); 2. 三. constructor属