浅谈JavaScript函数参数的可修改性问题
一道笔试题思考而来的,通常情况下没人会在函数内部修改参数值。这里仅拿出来讨论,有三种方式可以修改。
function f1(a) {
alert(a);
a = 1;//修改形参a
alert(1 === a);
alert(1 === arguments[0]);
}
f1(10);
函数f1定义了参数a,调用时传参数10,先弹出10,修改a为1,弹出两次true,a和arguments[0]都为1了。
function f2(a) {
alert(a);
arguments[0] = 1;//修改arguments
alert(1 === a);
alert(1 === arguments[0]);
}
效果同函数f1。
function f3(a) {
alert(a);
var a = 1;//声明局部变量a且赋值为1
alert(1 === a);
alert(arguments[0]);
}
f3(10);
函数f3定义了形参a,函数内部声明局部变量a同时赋值为1,但这里的a仍然是参数a,从最后弹出的arguments[0]被修改为1可以证明。
4,如果只是声明局部变量a,却不赋值,情况又不一样了
代码如下:
function f3(a) {
var a;//仅声明,不赋值
alert(a);
alert(arguments[0]);
}
f3(10);
这时候弹出的都是10,而不是undefined。
相关推荐
-
深入理解Javascript动态方法调用与参数修改的问题
Javascript中可以对所传参数在函数内进行修改,如下 复制代码 代码如下: function func1(name) { name = 'lily'; alert(name); } func1('jack');//输出lily 再看一个例子 复制代码 代码如下: function fun1(n) { this.name = n; } function fun2(name) { fun1.call(this,'lily'); alert(name);
-
浅谈JavaScript函数参数的可修改性问题
一道笔试题思考而来的,通常情况下没人会在函数内部修改参数值.这里仅拿出来讨论,有三种方式可以修改. 1,直接修改函数声明时的形参 复制代码 代码如下: function f1(a) { alert(a); a = 1;//修改形参a alert(1 === a); alert(1 === arguments[0]); } f1(10); 函数f1定义了参数a,调用时传参数10,先弹出10,修改a为1,弹出两次true,a和arguments[0]都为1了. 2,通
-
浅谈JavaScript函数的四种存在形态
函数的四种存在形态: 1.函数形态 2.方法形态 将函数赋值给某一个对象的成员,那么就称为方法 3.构造器形态 4.上下文形态 1.函数形态: var foo = function() { alert(this); //this是window }; 2.方法形态: o = {}; o.foo = foo; //将函数foo赋值给对象o的foo属性 o.foo(); //弹出的是object,此时的this表示object var lib = { test:function() { alert(t
-
浅谈JavaScript 函数参数传递到底是值传递还是引用传递
在传统的观念里,都认为JavaScript函数传递的是引用传递(也称之为指针传递),也有人认为是值传递和引用传递都具备.那么JS的参数传递到底是怎么回事呢?事实上以下的演示也完全可以用于Java 首先来一个比较简单的,基本类型的传递: function add(num){ num+=10; return num; } num=10; alert(add(num)); aelrt(num); //输出20,10 对于这里的输出20,10,按照JS的官方解释就是在基本类型参数传递的时候,做了一件复制
-
浅谈javascript函数劫持[转自xfocus]第1/3页
一.概述 javascript函数劫持,也就是老外提到的javascript hijacking技术.最早还是和剑心同学讨论问题时偶然看到的一段代码,大概这样写的: window.alert = function(s) {}; 觉得这种用法很巧妙新颖,和API Hook异曲同工,索性称之为javascript function hook,也就是函数劫持.通过替换js函数的实现来达到劫持这个函数调用的目的,一个完整的hook alert函数例子如下: <!--1.htm--> 复制代码 代码如下
-
浅谈javascript 函数内部属性
在函数内部有两个特殊的属性:arguments 和 this.arguments是一个类数组对象,包含传入的所有参数, 但是这个对象还有一个名叫callee的属性,该属性是一个指针,指向拥有这个arguments对象的函数. 请看经典的阶乘函数例子: 复制代码 代码如下: function Factorial(num) { if (num <= 1) { return 1; } else {
-
浅谈JavaScript函数节流
浏览器中某些计算和处理要比其他的昂贵的多.例如,DOM操作比起非DOM交互需要更多的内存和CPU时间.连续尝试进行过多的DOM相关操作可能会导致 浏览器挂起,有时候甚至会崩溃.尤其在IE中使用onresize事件处理程序的时候容易发生,当调整浏览器大小的时候,该事件连续触发.在 onresize事件处理程序内部如果尝试进行DOM操作,其高频率的更改可能会让浏览器崩溃. 函数节流背后的基本思想是,某些代码不可以在没有间断的情况连续重复执行.第一次调用函数,创建一个定时器,在指定的时间间隔之后运行代
-
浅谈javascript 函数属性和方法
每个函数都包含两个属性:length 和 prototype length:当前函数希望接受的命名参数的个数 prototype:是保存他们所有实力方法的真正所在 复制代码 代码如下: function sayName(name) { alert(name); } function sum(num1, num2) { return num1 + num2; }
-
浅谈javascript 函数表达式和函数声明的区别
javascript中声明函数的方法有两种:函数声明式和函数表达式. 区别如下: 1).以函数声明的方法定义的函数,函数名是必须的,而函数表达式的函数名是可选的. 2).以函数声明的方法定义的函数,函数可以在函数声明之前调用,而函数表达式的函数只能在声明之后调用. 3).以函数声明的方法定义的函数并不是真正的声明,它们仅仅可以出现在全局中,或者嵌套在其他的函数中,但是它们不能出现在循环,条件或者try/catch/finally中,而 函数表达式可以在任何地方声明. 下面分别用两种方法定
-
浅谈javascript的url参数parse和build函数
Parse: function getParam() { var param = new Object() var item = new Array(); if (location.search == "") { return param; }; var query = location.search.substring(1); var list = query.split('&'); for(var i = 0; i < list.length; i++) { item
-
浅谈Javascript中的函数、this以及原型
关于函数 在Javascript中函数实际上就是一个对象,具有引用类型的特征,所以你可以将函数直接传递给变量,这个变量将表示指向函数"对象"的指针,例如: function test(message){ alert(message); } var f = test; f('hello world'); 你也可以直接将函数申明赋值给变量: var f = function(message){ alert(message); }; f('hello world'); 在这种情况下,函数申明
随机推荐
- 在python中使用正则表达式查找可嵌套字符串组
- 深入理解ajax系列第一篇之XHR对象
- Sql中存储过程的定义、修改和删除操作
- jQuery可见性过滤器:hidden和:visibility用法实例
- Oracle批量导入文本文件快速的方法(sqlldr实现)
- 适用与firefox ASP.NET无刷新二级联动下拉列表
- php中计算程序运行时间的类代码
- Linux 脚本编写基础知识
- MYSQL GROUP BY用法详解
- php之字符串变相相减的代码
- 详解用vue.js和laravel实现微信授权登陆
- 手机端 HTML5使用photoswipe.js仿微信朋友圈图片放大效果
- asp+mysql+utf8 网页出现乱码问题的解决方法
- 访问JSP文件或者Servlet文件时提示下载的解决方法
- jQuery css() 方法动态修改CSS属性
- Sql Server中清空所有数据表中的记录
- node.js学习之交互式解释器REPL详解
- 用IIS建立的.net网站通过IP地址不能访问解决方法
- 提高IIS网站服务器效率的8个方法
- 服务器安全狗Linux版软件安装使用说明