JavaScript修改作用域外变量的方法

 更新时间:2016年03月25日 09:22:32   作者:thewindsword  
 作用域是JavaScript最重要的概念之一,想学好javascript需要深入理解javascript作用域原理,接下来通过本文给大家介绍javascript修改作用域外变量的方法,需要的朋友一起学习吧

1.今天在看JavaScript学习指南的时候做的课后习题,也因此详细的对函数的传入参数进行比较深入的研究.

题目如下:

  函数如何才能修改其作用域之外的变量?编写一个函数,由1~5的数字组成的数组作为参数,调用该函数后将把其中的数字项替换为相应的字符串表示形式.

需要注意知识点:

  在JavaScript中函数参数的传递,对于基于原始值的参数进行值传递(数字,字符串,布尔值),函数中的修改不会影响实际参数值.而传递给函数的参数而言,对象是一个引用,对其的修改的将会反映在主调程序中.<-但是,会有这样的情况,如下

var outer_number = ;
var outer_boolean = true;
var outer_array = [,,];
var outer_object = {test:""};
function display(num,bool,arr,obj){
console.log("number:"+num+"\nboolean:"+bool+"\narray:"+arr+"\nobject:"+obj.test);
}
function test(num,bool,arr,obj){
display(num,bool,arr,obj);//num=,bool=true,array=[,,],object.test=
num = ;
bool = false;
arr[] = ;
obj.test = "";
display(num,bool,arr,obj);//num=,bool=false,array=[,,,],object.test=
arr = [,,];
obj = {test:""};
display(num,bool,arr,obj);//num=,bool=false,array=[,,],object.test=
}
test(outer_number,outer_boolean,outer_array,outer_object);
display(outer_number,outer_boolean,outer_array,outer_object);//num = ,bool=true,array=[,,,],object.test= 

在上面代码中我们创建了4个全局变量,类型分别为数字,布尔值,数组,对象.2个函数,display和test.

display执行了4次,分别结果如下:

"number:2
boolean:true
array:1,2,3
object:122"<-传入函数时的值

"number:0
boolean:false
array:1,2,3,3
object:134"<-执行更改

"number:0
boolean:false
array:3,2,1
object:133"<-重新赋值

"number:2
boolean:true
array:1,2,3,3
object:134"<-函数执行完毕后

可以看出我们对数组和对象的重新赋值并没有成功,如果按引用传递,那么我们应该也对全局变量的数组和对象重新赋值修改了呀.
其实JavaScript中所谓的按引用赋值并不是真正意义上的按引用复制,准确说应该是按共享传递.也可以叫按对象传递,按对象共享传递(call by sharing).

在这个按共享传递的条件下,我们获取的引用可以说只是实参引用的副本,它和我们经常说的按引用传递的最大差别就在于我们在对引用副本的赋值不会影响实参的值,正如我们上面那样做的那样,赋值操作是不可行的.

当然我们从对象类型和基本类型两方面看,对象是可变的而基本类型是不可变的(注意!字符串修改其实是返回的新的字符串),所以按共享传递对于基本类型来说也是符合按共享传递的.

总结一下:

  JavaScript中,基本类型和对象都按共享传递(call by sharing),但是由于JavaScript的基本类型的不变性,基本类型按共享传递与按值传递没有任何区别,而对象按共享传递.

按共享传递(call by sharing):传递的是实参引用的副本,我们对引用副本的赋值不影响实参的值,但是可以使用引用副本去修改引用的内容.详细的wiki地址

函数对传入的参数:

1.基本类型,按值传递(或者也可以说按共享传递),内部赋值修改都不影响主调程序

2.对象类型,按共享传递,传入的为实参引用的副本,内部对该引用的赋值无效,对对象属性的赋值修改有效.

大概就是这么理解了,假如有什么地方我犯了什么错误,也希望能被指出来.

下面单独拉出JavaScript作用域

  任何程序设计语言都有作用域的概念,简单的说,作用域就是变量与函数的可访问范围,即作用域控制着变量与函数的可见性和生命周期。在JavaScript中,变量的作用域有全局作用域和局部作用域两种。

   全局作用域(Global Scope)

  在代码中任何地方都能访问到的对象拥有全局作用域,一般来说以下几种情形拥有全局作用域:

  (1)最外层函数和在最外层函数外面定义的变量拥有全局作用域,例如:

var authorName="山边小溪";
function doSomething(){
var blogName="梦想天空";
function innerSay(){
alert(blogName);
}
innerSay();
}
alert(authorName); //山边小溪
alert(blogName); //脚本错误
doSomething(); //梦想天空
innerSay() //脚本错误

  (2)所有末定义直接赋值的变量自动声明为拥有全局作用域,例如:

function doSomething(){
var authorName="山边小溪";
blogName="梦想天空";
alert(authorName);
}
doSomething(); //山边小溪
alert(blogName); //梦想天空
alert(authorName); //脚本错误 

  变量blogName拥有全局作用域,而authorName在函数外部无法访问到。

  (3)所有window对象的属性拥有全局作用域

  一般情况下,window对象的内置属性都拥有全局作用域,例如window.name、window.location、window.top等等。

  1. 局部作用域(Local Scope)  

  和全局作用域相反,局部作用域一般只在固定的代码片段内可访问到,最常见的例如函数内部,所有在一些地方也会看到有人把这种作用域称为函数作用域,例如下列代码中的blogName和函数innerSay都只拥有局部作用域。

function doSomething(){
var blogName="梦想天空";
function innerSay(){
alert(blogName);
}
innerSay();
}
alert(blogName); //脚本错误
innerSay(); //脚本错误 

相关文章

  • jquery自定义插件结合baiduTemplate.js实现异步刷新(附源码)

    jquery自定义插件结合baiduTemplate.js实现异步刷新(附源码)

    本文主要介绍了jquery自定义插件结合baiduTemplate.js实现异步刷新的具体实例,具有很好的参考价值,需要的朋友一起来看下吧
    2016-12-12
  • IE浏览器下PNG相关功能

    IE浏览器下PNG相关功能

    本文给大家汇总了一下png在IE浏览器下出现的各种问题的解决方法,十分的实用,有需要的小伙伴可以参考下。
    2015-07-07
  • 微信小程序中如何计算距离某个节日还有多少天

    微信小程序中如何计算距离某个节日还有多少天

    这篇文章主要给大家介绍了关于微信小程序中如何计算距离某个节日还有多少天的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用微信小程序具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-07-07
  • JavaScript获取并更改input标签name属性的方法

    JavaScript获取并更改input标签name属性的方法

    这篇文章主要介绍了JavaScript获取并更改input标签name属性的方法,涉及javascript针对表单元素属性的相关操作技巧,需要的朋友可以参考下
    2015-07-07
  • JavaScript中layer关闭指定弹出窗口方法总结

    JavaScript中layer关闭指定弹出窗口方法总结

    这篇文章主要给大家介绍了关于JavaScript中layer关闭指定弹出窗口方法的相关资料,layer是layui的一个弹出层组件,但是可以作为独立组件使用,需要的朋友可以参考下
    2023-10-10
  • js实现幻灯片轮播图

    js实现幻灯片轮播图

    这篇文章主要为大家详细介绍了js实现幻灯片轮播图,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-08-08
  • 基于javascript的异步编程实例详解

    基于javascript的异步编程实例详解

    这篇文章主要介绍了基于javascript的异步编程,结合实例形式分析了javascript异步编程的原理、实现技巧与相关注意事项,需要的朋友可以参考下
    2017-04-04
  • 微信小程序基于高德地图API实现天气组件(动态效果)

    微信小程序基于高德地图API实现天气组件(动态效果)

    这篇文章主要介绍了微信小程序基于高德地图API实现天气组件(动态效果),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-10-10
  • 引入外部js脚本加载慢与页面白屏问题的解决

    引入外部js脚本加载慢与页面白屏问题的解决

    最近做的一个项目需要引入一个外部的第三方js脚本。发现加载比较慢,这篇文章主要介绍了引入外部js脚本加载慢与页面白屏问题的解决,感兴趣的小伙伴们可以参考一下
    2018-12-12
  • 深入学习 JavaScript中的函数调用

    深入学习 JavaScript中的函数调用

    可能很多人在学习 JavaScript 过程中碰到过函数参数传递方式的迷惑,本着深入的精神,我给大家分享了一篇教程关于javascript中的函数调用知识,感兴趣的朋友一起学习吧
    2017-03-03

最新评论