javascript-请教有关JS中变量的问题

问题描述

请教有关JS中变量的问题

举个栗子:
window.onload=function(){
var a=1;
var b=2;
plus(a,b);
function plus(a,b){
a=a+b;
b=0;
//此时在这个函数内还能调用到父函数中的a=1,b=2吗?

}

}

解决方案

这个问题是两种不同变量在作为参数传递的问题,JS传递变量分为两种一种是基础变量,传递的是变量内容,第二种是引用变量(对象),在函数中传递的指向对象的指针,楼主这个函数传递的是基础变量,所以在子作用域中修改了变量,在父作用域中变量并没有修改,但是你如果将a、b封装在对象中,将对象作为函数参数传递过去,就可以修改父函数的内容了。如下代码所示。

 window.onload=function(){
var a=1;
var b=2;
plus(a,b);
function plus(a,b){
a=a+b;// 等同于 var a = a+b;此处的a是子作用域新定义的a,那么子作用域就有两个名为a的基本变量,按js规则,后面定义的基本变量会覆盖前者
b=0;//同上
}
}

修改代码如下:

window.onload=function(){
    var obj = {};
    obj.a = 1;
    obj.b = 2;
    alert(obj.a);
    alert(obj.b);

    plus(obj);
    function plus(obj){
    a = obj.a+obj.b;
    b = 0;
    alert("innerA:"+obj.a);
    alert("innerB:"+obj.b);

    }
    alert("outterA:"+obj.a);
    alert("outterB:"+obj.b);
}

解决方案二:

可以,这个叫闭包(closure)内侧的函数可以访问外面的自由变量,反过来不行。

解决方案三:

可以,这是js中高级知识的闭包,可以调用上级作用域,

解决方案四:

可以,但是a b值已经改变了

解决方案五:

明确告诉你调用不到,而且这个代码断也并没有涉及到闭包。在plus函数中a b两个变量均为私有变量,而不是onload函数中的a b变量,且js函数参数都是按值传递的,所以onload函数中的a b并没有发生改变

解决方案六:

js中变量的声明
JS 调用后台变量的值

时间: 2024-09-19 09:42:57

javascript-请教有关JS中变量的问题的相关文章

不错的JS中变量相关的细节分析_javascript技巧

这里讨论一下我对Javascript中变量相关细节的认识,有不当之处欢迎来批. 一.变量的类型 Javascript和Java.C这些语言不同,它是一种无类型.弱检测的语言.它对变量的定义并不需要声明变量类型,我们只要通过赋值的形式,可以将各种类型的数据赋值给同一个变量.例如: i=100;//Number类型 i="variable";//String类型 i={x:4};//Object类型 i=[1,2,3];//Array类型 JS的这种特性虽然让我们的编码更加灵活,但也带来了

JS中变量的作用域

js中变量的作用域 js中变量的作用域分为全局变量和局部变量,函数内定义的称为局部变量,函数外的称为全局变量.("函数外的称为全局变量"是相对的,另此处讨论的前提是用var显式声明的变量,函数内不用var定义的变量默认是全局变量,当然忽略var声明变量是不赞成的). view sourceprint?1 var glob = 4;//函数外声明全局变量  2 function fun() {  3     var height = 20; //函数内用var声明的是局部变量  4   

求大神用通俗语言解析下这个javascript代码以及JS中原型的具体作用。

问题描述 求大神用通俗语言解析下这个javascript代码以及JS中原型的具体作用. window.onload=function () { var oTab=new TabSwitch('div1'); }; function TabSwitch(id) { var oDiv=document.getElementById(id); this.aBtn=oDiv.getElementsByTagName('input'); this.aDiv=oDiv.getElementsByTagNam

javascript for循环-js 中for循环成为死循环

问题描述 js 中for循环成为死循环 下面两个代码,通过 main去循环调用 testfor函数,当main中的i>=6的时候,一直死循环,不断地) alert 出 "i=6 , true" ,刚刚接触JavaScript,请教了~ function testfor(x){ for (i=0;i<5;i++){ alert(i); if(i==x) { return false; } } return true; } function main(){ for (i=3;i

浅谈js中变量初始化_javascript技巧

我在js里面写了一个去除首尾空格及特定字符的函数.代码如下: 复制代码 代码如下: function trim(str, charlist) {     return str.replace(new RegExp('^[\\s'+charlist+']+|[\\s'+charlist+']+$', 'g'), ''); } 代码看上去没有什么问题,运行起来也没有错误. 直到今天,我在搜索栏里搜索"note3"的时候,才发现,地址栏里搜索的内容变成了"ote3",而其

请教关于js中迭代的问题

问题描述 我想取给定节点的子节点中已知id的目标节点.代码如下,但是当迭代找到目标节点后return不出来,而必须等待迭代结束.code:... <div id="div"> <pre> <div class="src"> <pre><div class="src"> <dl id="L1"> 1 </dl> <span class=&q

javascript中变量对象的问题

今天在网上看到一段代码,如下  代码如下 复制代码 copytext console.log(typeof(s)); //function var s = "1111"; function s(){} console.log(typeof(s)); //stringconsole.log(typeof(s)); //function var s = "1111"; function s(){} console.log(typeof(s)); //string 琢磨了

JavaScript中变量声明有var和没var的区别

 本文来论述JavaScript中变量声明有var和没var的区别,关于Js中的变量声明的作用域是以函数为单位,所以我们经常见到避免全局变量污染的方法是 1 2 3 (function(){  // ...  })(); 在函数内部,有var和没var声明的变量是不一样的.有var声明的是局部变量,没var的,声明的全局变量,所以可以借此向外暴露接口东东. 在全局作用域内声明变量时,有var 和没var看起来都一样,我们知道,声明的全局变量,就是window的属性,究竟是否一样,我们通过ECMA

在Node.js中使用MySQL&amp;MySQL JavaScript客户端

NoSQL 数据库最近一段时间都是很受追捧的,也许已经是 Node.js 应用程序的首选后端了.不过,你不应该只是根据潮流来选择拿什么技术构建下一个项目,使用什么数据库类型要取决于项目的特定需求.如果你的项目涉及到动态表的创建,实时的插入等等,那么 NoSQL 就是不错的技术路线,而另一方面,如果项目中要处理复杂的查询和事务,那么 SQL 数据库就更加合适了. 在本教程中,我们会向你介绍如何使用 MySQL 模块 - 这是一个用 JavaScript 编写的运行在 Node.js 之上的 MyS