JS的作用域

变量包含两种数据类型的值:

1. 基本类型值如undefined、boolean、Null、number、string,这类值是可以直接操作的,有读写权

2.引用类型值:保存在内存中的对象。可以引用添加属性,不能对值进行操作,只有读的权限。可以对其添加属性和方法,也能改变或删除其属性或方法

这两种值在进行复制时机制也不同:

1.基本类型值:靠值

  var num1=5;

  var num2=num1;

  num1+=;

  alert(num2) //5

num1与num2是相互独立的,相当于开辟一块新的内存,num1和num2再进行改变,互相不会影响。

2.引用类型值:靠引用

  var obj1=new object();

  var obj2=obj1;

  obj1.name="jone";

  console.log(obj2.name) //jone

相当于obj1和obj2都指向object()这个对象所在内存,属性一样。若object()改变,obj1、obj2都会改变。

参数的传递:EMACScript中所有函数的参数传递都是按值传递的(开辟新内寸,参数与被当做参数传递的对象互不干扰)

1.基本类型值被当做参数传值是按照值的方式传递,很好理解。

  function plus(num){

    num+=10;

    return num;

  }

  var num1=20;

  var num2=plus(num1);

  alert(num1); //20

  alert(num2); //30

2.引用类型值被当做参数传递也是按值传递的(改变参数并不能改变被当做参数传递的对象,参数和传递对象驻扎在两块不同的内存中)

function setName(obj){
obj.name="jone";
obj = new Object();   //参数在此被改变,加上name属性
obj.name="linda";
alert(obj.name)   //linda  局部变量,函数执行之后被立即销毁,不复存在
}
var person= new Object();
setName(person)
alert(person.name)  //jone  并没有变成linda

函数的参数相当于局部变量,被当做参数传递的对象是全局对象/变量。

执行环境和作用域:

执行环境定义了变量或者函数访问其他数据的权限。

web浏览器全局执行环境被认为是window对象,浏览器退出时全局执行环境才会被销毁。

每个函数都有自己的执行环境,执行流进入某一函数时,函数环境就会被推入一个环境栈中,函数执行之后栈将其弹出,控制权返回给之前的执行环境。该机制控制EMACScript的执行流程。让执行环境有序进行。

代码运行到某一环境时候,会创建变量对象的作用域链。作用域链让执行环境的变量和函数被有序访问。

内部环境可以通过作用域链访问所有的外部环境,但外部环境不能访问内部环境中的任何变量和函数。

局部环境会现在自己的变量对象中搜索变量和函数,如果搜索不到再搜索上一级作用域链。

时间: 2024-10-12 14:39:13

JS的作用域的相关文章

js 的作用域

js的作用域 一. 方式1.常用方式: function test (参数) { ………….方法的实现……………….. }这种方式的函数声明的先后位置与调用无关,可以在调用的前面声明,也可以在调用的后面声明;2.匿名函数: 把方法赋给一个变量,此时这个变量是一种方法类的变量;Var a = function (参数) {………..方法的实现……………………}这种方式的函数声明必须放在调用的前面;匿名函数直接调用的方式,例如: alert(function () {} 二. 参数的管理:每一个函数

浅谈 js eval作用域

就简单聊下如何全局 eval 一个代码. var x = 1; (function () { eval('var x = 123;'); })(); console.log(x); 这个代码得到的是 1 而不是 123如果想让 eval 执行的代码是全局的,那么有几种方法. var x = 1; (function () { window.eval('var x = 123;'); })(); console.log(x); 这个方法标准浏览器都可以得到 123 而IE6-8则依然是 1 相同的

js变量作用域--变量提升

1.JS作用域 在ES5中,js只有两种形式的作用域:全局作用域和函数作用域,在ES6中,新增了一个块级作用域(最近的大括号涵盖的范围),但是仅限于let方式申明的变量. 2.变量声明 1 var x; //变量声明 2 var x=1; //变量声明并赋值 3 x = 1; // 定义全局变量并赋值 3.函数声明 function fn(){}; //函数声明并定义 var fn = function(){}; // 实际上是定义了一个局部变量fn和一个匿名函数,然后把这个匿名函数赋值给了fn

js变量作用域

? 1 2 3 4 5 6 7 8 9 10 for(var i =0;i<100;i++)   {        } alert(i);//100 if(true){     var i="91d";   } alert(i);//91d ? 1 2 3 4 5 6 function add(ad1,ad2){   sum=ad1+ad2;   return sum;//如果没有用var声明局部变量,会提升为全局的变量 } alert(add(3,5)); alert(&quo

简述JS的作用域和闭包

作用域:它是指对某一变量和方法具有访问权限的代码空间, 在JS中, 作用域是在函数中维护的.表示变量或函数起作用的区域,指代了它们在什么样的上下文中执行,亦即上下文执行环境.Javascript的作用域只有两种:全局作用域和本地作用域,本地作用域是按照函数来区分的. 闭包:在js中的我的理解就是函数嵌套函数,当内部函数在定义它的作用域的外部被引用时,就创建了该内部函数的闭包 ,如果内部函数引用了位于外部函数的变量,当外部函数调用完毕后,这些变量在内存不会被 释放,因为闭包需要它们. 作用域的嵌套

js私有作用域(function(){})(); 模仿块级作用域

摘自:http://outofmemory.cn/wr/?u=http%3A%2F%2Fwww.phpvar.com%2Farchives%2F3033.html js没有块级作用域,简单的例子: for(var i=0;i<10;i++){ alert(i); } alert(i); for循环后的i,在其它语言像c.Java中,会在for结束后被销毁,但js在后续的操作中仍然能访问到i值,即for循环后的alert(i);会弹出数值i=10; js模仿块级作用域: (function(){

JS 之作用域链和闭包

1.JS无块级作用域 <script> function Main(){ if (1==1){ var name = "alex"; } console.log(name); } Main(); </script>执行结果:{}即块级作用域. alex 2.JS采用函数作为作用域链 <script> function Main(){ var innerValue = "alex"; } Main(); console.log(in

js静态作用域与this绑定

<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>Document</title></head><body> <h1>js静态作用域与this绑定</h1> </body><script type="text/javascript&qu

JS中作用域和变量提升(hoisting)的深入理解

作用域(Scoping) javascript作用域之所以迷惑,是因为它程序语法本身长的像C家族的语言.我对作用域的理解是只会对某个范围产生作用,而不会对外产生影响的封闭空间.在这样的一些空间里,外部不能访问内部变量,但内部可以访问外部变量. c语言的变量分为全局变量和局部变量,全局变量的作用范围是任何文件和函数访问(当然,对于非变量定义的其他c文件,需要使用extern关键字进行申明,使用static关键字也可以将作用范围限定在当前文件中),局部变量的作用范围就是从申明到最近的大括号涵盖的块级

js中作用域链的问题

为什么没有var声明的变量是全局的? 是因为,在js中,如果某个变量没有var声明,会自动到上一层作用域中去找这个变量的声明语句,如果找到,就使用,如果没有找到,继续向上查找,一直查找到全局作用域为止,如果全局中仍然没有这个变量的声明语句,那么会自动在全局作用域进行声明,这个就是js中的作用域链 <script> var i = 10; function f1() { //第一层 i = 20; function f2() { //第二层 i = 30; function f3() { //第