浅谈arguments与arguments的妙用
1.每个函数都有一个arguments属性,表示函数的实参集合,这里的实参是重点,就是执行函数时实际传入的参数的集合。
2.arguments不是数组而是一个对象,但它和数组很相似,所以通常称为类数组对象,以后看到类数组其实就表示arguments。
3.arguments有length属性,可以用arguments[length]显示调用:
function func(){
for(var i=0;i<arguments.length;i++){
console.log(arguments[i]);
}
}
func("a",17,[1,2,3],{name:"javascript",type:"language"});
/*
a
17
[1, 2, 3]
{name: "javascript", type: "language"}
*/
4.Array.prototype.slice.call(arguments):
首先我们看看call是干啥的,举个例子:
var obj1={
name:"java"
}
window.name="javascript";
var func=function(){
console.log(this.name);
}
func(); //javasript
func.call(obj1); //java
我们可以很清楚的看到,call的一个作用是可以改变函数运行的作用域,func中的this指向了obj1,(call和apply的其他作用请参阅js中call和apply的用法)
那Array.prototype.slice.call(arguments)是干啥的呢,首先我们猜测Array.prototype.slice是一个方法,将它call(arguments)之后,Array.prototype.slice中的this就指向了arguments对象了。
其实Array.slice是一个数组复制函数,它接受两个参数(strat,[end]);从下标为start复制到下标为end,举个栗子:
var numArr=[1,2,3,4,5];
console.log(numArr.slice(0,4)); //[1,2,3,4]
console.log(numArr.slice()); //[1,2,3,4,5]
console.log(numArr.slice(1)) //[2,3,4,5]
我们可以大胆的猜测一下slice函数的内部实现:参阅http://www.cnblogs.com/littledu/archive/2012/05/19/2508672.html
Array.prototype.slice = function(start,end){
var result = new Array();
start = start || 0;
end = end || this.length; //this指向调用的对象,当用了call后,能够改变this的指向,也就是指向传进来的对象,这是关键
for(var i = start; i < end; i++){
result.push(this[i]);
}
return result;
}
注意当中的result.push(this[i]),当Array.prototype.slice.call(arguments)后,就变成了result.push(arguments[i]),这样就将arguments转成了一个实实在在的数组了。
5.小练习:
一个给对象添加属性的函数。
思考一下:首先得传入一个实参,这个实参是要被添加属性的对象。
剩下的参数是属性键值对,可以用对象表示:
var obj={};
//先看执行函数
function addProp(){
var obj=[].shift.call(arguments); //shift()函数是将数组的第一个值删除,并返回,这里是得到obj
var propArray=[].slice.call(arguments); //此时的argument[0]已被删除,所以propArray=[{name:"gao",age:"18"},{setName:function(name){this.name=name;}]
for(var i in propArray){
//prop[0]={name:"gao",age:"18"}
//prop[1]={setName:function(name){this.name=name;}
for(var j in propArray[i]){
obj[j]=propArray[i][j];
//obj[name]="gao"
//obj[age]="18"
//obj[setName]=function(name){this.name=name;}
}
}
}
//执行函数
addProp(obj,{name:"gao",age:"18"},{setName:function(name){
this.name=name;
}});
console.log(obj.name); //gao
obj.setName("xiang");
console.log(obj.name); //xiang
浅谈arguments与arguments的妙用的更多相关文章
- 浅谈JS的arguments对象
在JavaScript中,arguments属于当前对象的一个内置属性,arguments非常类似于Array对象,但是又不是实例的Array.比如: Array.prototype.testArg ...
- 浅谈[].slice.call(arguments, 1)
今天在跟踪调试项目的代码时,发现在一个function中用到了这么一段[].slice.call(arguments, 1) 的代码.心中便起了疑惑,对于slice 和 call 的方法,倒是不怎么陌 ...
- 浅谈js的类数组对象arguments
类数组对象:arguments总所周知,js是一门相当灵活的语言.当我们在js中在调用一个函数的时候,我们经常会给这个函数传递一些参数,js把传入到这个函数的全部参数存储在一个叫做arguments的 ...
- 浅谈HTML5单页面架构(二)——backbone + requirejs + zepto + underscore
本文转载自:http://www.cnblogs.com/kenkofox/p/4648472.html 上一篇<浅谈HTML5单页面架构(一)--requirejs + angular + a ...
- 浅谈javascript函数节流
浅谈javascript函数节流 什么是函数节流? 函数节流简单的来说就是不想让该函数在很短的时间内连续被调用,比如我们最常见的是窗口缩放的时候,经常会执行一些其他的操作函数,比如发一个ajax请求等 ...
- 浅谈JavaScript中的闭包
浅谈JavaScript中的闭包 在JavaScript中,闭包是指这样一个函数:它有权访问另一个函数作用域中的变量. 创建一个闭包的常用的方式:在一个函数内部创建另一个函数. 比如: functio ...
- 【微信小程序项目实践总结】30分钟从陌生到熟悉 web app 、native app、hybrid app比较 30分钟ES6从陌生到熟悉 【原创】浅谈内存泄露 HTML5 五子棋 - JS/Canvas 游戏 meta 详解,html5 meta 标签日常设置 C#中回滚TransactionScope的使用方法和原理
[微信小程序项目实践总结]30分钟从陌生到熟悉 前言 我们之前对小程序做了基本学习: 1. 微信小程序开发07-列表页面怎么做 2. 微信小程序开发06-一个业务页面的完成 3. 微信小程序开发05- ...
- 浅谈JS严格模式
浅谈JS严格模式 简介 何为严格模式?严格模式(strict mode)即在严格的条件下运行,在严格模式下,很多正常情况下不会报错的问题语句,将会报错并阻止运行. 但是,严格模式可以显著提高代码的健壮 ...
- C学习笔记(11)--- 可变参数,浅谈内存管理 【C基础概念系列完结】
1.可变参数(variable arguments): 可变参数允许您定义一个函数,能根据具体的需求接受可变数量的参数. int func(int, ... ) (函数 fun ...
- [转载]浅谈JavaScript函数重载
原文地址:浅谈JavaScript函数重载 作者:ChessZhang 上个星期四下午,接到了网易的视频面试(前端实习生第二轮技术面试).面了一个多小时,自我感觉面试得很糟糕的,因为问到的很多问题都 ...
随机推荐
- python有哪些比较隐藏的知识点?
一.复用小整数以及小字符串 在Python语言中,设计者在优化Python语言时,为了提高Python的运行效率,所以就将一些小整数保存在系统表,没有释放回收(正常情况下,当Python中一个对象没有 ...
- C#静态和实例
静态 实例 关键字static修饰类或方法 不能使用static修饰类或方法 修饰后类直接调用 需要先实例化对象,用对象调用 静态只会执行调用一次,并且在程序退出之前会一直保持状态,占领内存 实例化一 ...
- golang在gitlab中的工作流
在敏捷开发的时代, 快速的编码, code review, 测试, 部署, 是提升程序员效率的关键. 同时在基础工具完备的如今, 我们甚至无需过多的操作就可以轻松实现上述步骤, 本文就以gitlab为 ...
- Mac无法将自定义图标添加到Launchpad的替代方案(桌面双击Shell运行)
截止在几天之前的Mac OS版本都无法实现将自定义图标添加到Launchpad.我使用的是10.12. 替代的思路就是在桌面新建一个Shell文件,然后使软件在后台运行,最后就是双击Shell文件能自 ...
- Firefox、Chrome、IE9、IE8、IE7、IE6等浏览器HTTP_USER_AGENT汇总
Firefox.Chrome.IE9.IE8.IE7.IE6 浏览器HTTP_USER_AGENT汇总 结论: 浏览器 \ OS XP(IE6) XP(IE7) XP(IE8) Win7 x64(I ...
- maven上传源码到私服
上传源码 项目中采用了分模块的方式构建,直接将maven-source-plugin写到父pom中,尝试了很多次发现源码一直不能上传到私服中,纠结了很长时间才发现原来多模块项目和普通一个项目的配置是有 ...
- Django与前端的交互
在创建Django项目后,我们创建了一个App,我将这个App的名字命名为Cal,并在Cal这个文件夹下创建文件 templates. 创建templates文件夹以后,在项目settings.py文 ...
- WPF中设置了WindowStyle="None"后,窗口仍然有边框的解决方法
1. 设置了窗体的WindowStyle="None",窗口还是右边框,如下图: 2. 这是因为窗体默认是可以改变大小的,所以需要修改ResizeMode的值 ResizeMode ...
- url解码
最近在做流量分析的项目.需要将url解码.写了个代码,先存一下,有时间再仔细写写. #include <stdio.h> #include <stdlib.h> #includ ...
- 定时IIS任务自动停止及解决办法
---恢复内容开始--- 操作系统:WinServer2008 R2 IIS版本:IIS7.0 目的:利用IIS挂载服务,定时或循环作业 症状:在网站的Global.asax.cs文件的Applica ...