浅谈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 上个星期四下午,接到了网易的视频面试(前端实习生第二轮技术面试).面了一个多小时,自我感觉面试得很糟糕的,因为问到的很多问题都 ...
随机推荐
- RN47 中通过 JS 调用 Native 方法
每一个模块.方法都有一个 ID,通过 ID 来调用. m_registry->callNativeMethod(call.moduleId, call.methodId, std::move(c ...
- Spring Boot入门教程(1)
Spring Boot入门教程(1) 本文将使用Spring Boot一步步搭建一个简单的Web项目来帮助你快速上手. 将要用到的工具 JDK 8 IntelliJ IDEA(Ultimate Edi ...
- Codeforces Round #555 (Div. 3) C2. Increasing Subsequence (hard version)【模拟】
一 题面 C2. Increasing Subsequence (hard version) 二 分析 需要思考清楚再写的一个题目,不能一看题目就上手,容易写错. 分以下几种情况: 1 左右两端数都小 ...
- 2018徐州网络赛 - Trace
题意:n个左下角为原点右上角在第一象限的矩形不断覆盖,求最后形成的图形的周长 x和y是独立的,分别维护两棵线段树,一棵表示x坐标下最大的y值,另一棵表示y坐标下最大的x值 从覆盖的角度来考虑,如果逆序 ...
- windows 下加载执行hta文件的方法
首先编写这么一个hta的文件: <html> <head> <script> s = new ActiveXObject("WScript.Shell&q ...
- session_destroy()和session_unset()的理解
session_destroy 是注销所有的session变量,并且结束session会话目前是删除当前用户对应的session文件以及释放session id值 ,但是但是 内存中的$_SESSIO ...
- Mac 10.12安装Command+Q误按提示工具
说明:很多时候不小心会按强制关闭而无任何提示,这款工具能延迟关闭,并有相应的提示. 下载: (链接: https://pan.baidu.com/s/1bpyJMPL 密码: bqn1)
- 搭建类似生产环境的RAC
install the necessary packages yum install -y 创建组.用户和目录 创建用户组 groupadd -g 2000 oinstallgroupadd -g 2 ...
- Linux网络编程服务器模型选择之并发服务器(下)
前面两篇文章(参见)分别介绍了循环服务器和简单的并发服务器网络模型,我们已经知道循环服务器模型效率较低,同一时刻只能为一个客户端提供服务,而且对于TCP模型来说,还存在单客户端长久独占与服务器的连接, ...
- unity 2018获取本地ip 问题,ipaddress
Network.Player.ipAddress这个API在Unity2018被移除了 用如下代码 using System.Net; using System.Net.NetworkInformat ...