一:localstorage || globalStorage || userData
globalStorage
这个也是html5中提出来,在浏览器关闭以后,使用globalStorage存储的信息仍能够保留下来,并且存储容量比IE的userdata大得多,一个域下面是5120k。和sessionStorage一样,域中任何一个页面存储的信息都能被所有的页面共享。
作用域
globalStorage[''] 所有下面的页面都可以使用这块空间
globalStorage[''] 所有下面的页面都可以使用这块空间
globalStorage['com']:所有com域名都可以 共享的使用这一块空间
globalStorage[''] :所有页面都可以使用的空间
现在Firefox只支持当前域下的globalStorage存储, 如果使用公用域会导致一个这样一个类似的错误“Security error” code: “1000”。
过期时间
按照HTML5的描述,globalStorage只在安全问题或者当用户要求时才会过期,浏览器应该避免删除那些正在被脚本访问的数据,并且userdata应该是用户可写的。
因此我们的脚本要能够控制过期时间,可以在globalStorage的某个区域存储过期时间,在load的时候判断是否过期,可以在一定程度上解决过期时间的问题。
存储时,同时存储过期时间
以上是我从网上查询到的资料,为了兼容非IE浏览器“userdata”,我改进了之前我自己写的一个
“userdata”(见 UserData使用总结) ,现在是兼容IE和支持globalStorage的浏览器了。
复制代码 代码如下:
function behaviorUserdata(udObj)
{
var me = this;
if(CMInfo.Bs_Name=='IE') //IE下用userdata实现客户端存储
{
var loaded = ''; //当前已载入的文件名
this.udObj = getObject(udObj);
this.udObj.style.behavior = 'url(#default#userdata)';
this.value = this.udObj.value;
this.inhtml = this.udObj.innerHTML;
//检查文件是否存在,存在est=undefined并返回true否则返回false
this.exist = function(filename){
try{
me.udObj.load(filename);//将文件名为 filename的 XML 载入
me.loaded = filename;
return true;
}catch(e){ return false;}
}
//预加载
this.preLoad = function(filename){
if(me.loaded=='' || me.loaded!=filename){me.exist(filename);}
return me.loaded;
}
//获取指定的属性值
this.getAtrib = function(filename,atrib){
if(me.preLoad(filename)!='')
{
var val = me.udObj.getAttribute(atrib);
return val==null?"":val;
}return "";
}
//移除对象的指定属性
this.remAtrib = function(filename,atrib){
me.udObj.removeAttribute(atrib);
me.udObj.save(filename); //将对象数据保存到名为filename的XML文件里面
return true;
}
//设置指定的属性值
this.setAtrib = function(filename,atrib,val,expire){
var etime = typeof(expire)=="undefined"?24*60*60:expire;
me.udObj.expires = me.setExpire(etime);
me.udObj.setAttribute(atrib,val);
me.udObj.save(filename);
}
//设置一个系列的对象数据(即整个XML文件)失效
this.remPartion = function(filename){
if(me.exist(filename))
{
me.udObj.expires = me.setExpire(-1);
me.udObj.save(filename);
}
}
//设置有效期
this.setExpire = function(sec){
var oTimeNow = new Date();
oTimeNow.setSeconds(oTimeNow.getSeconds() + parseInt(sec));
return oTimeNow.toUTCString();
}
}else //非IE下用globalStorage实现客户端存储
{
var domain = document.domain;
//获取指定的属性值
this.getAtrib = function(filename,atrib){
var oTimeNow = new Date();
var etime = parseInt(window.globalStorage[domain][filename + "__expire"]);
if(!etime || etime < parseInt(oTimeNow.getTime()))
{
me.remPartion(filename);
return '';
}
return window.globalStorage[domain][filename + "__" + atrib];
}
//移除对象的指定属性
this.remAtrib = function(filename,atrib){
try{window.globalStorage.removeItem(filename + "__" + atrib);}catch(e){}//删除
return true;
}
//设置指定的属性值
this.setAtrib = function(filename,atrib,val,expire){
var etime = typeof(expire)=="undefined"?24*60*60:expire;
window.globalStorage[domain][filename + "__expire"] = me.setExpire(etime);
window.globalStorage[domain][filename + "__" + atrib] = val;
}
//设置一个系列的对象数据失效
this.remPartion = function(filename){
me.remAtrib(filename,"expire");
return true;
}
//设置有效期
this.setExpire = function(sec){
var oTimeNow = new Date();
oTimeNow.setSeconds(oTimeNow.getSeconds() + parseInt(sec));
return oTimeNow.getTime();
}
}
}
二:jsonp跨域请求
Asynchronous JavaScript and XML (Ajax ) 是驱动新一代 Web 站点(流行术语为 Web 2.0 站点)的关键技术。Ajax 允许在不干扰 Web 应用程序的显示和行为的情况下在后台进行数据检索。使用 XMLHttpRequest
函数获取数据,它是一种 API,允许客户端 JavaScript 通过 HTTP 连接到远程服务器。Ajax 也是许多 mashup 的驱动力,它可将来自多个地方的内容集成为单一 Web 应用程序。
不过,由于受到浏览器的限制,该方法不允许跨域通信。如果尝试从不同的域请求数据,会出现安全错误。如果能控制数 据驻留的远程服务器并且每个请求都前往同一域,就可以避免这些安全错误。但是,如果仅停留在自己的服务器上,Web 应用程序还有什么用处呢?如果需要从多个第三方服务器收集数据时,又该怎么办?
理解同源策略限制
同源策略阻止从一个域上加载的脚本获取或操作另一个域上的文档属性。也就是说,受到请求的 URL 的域必须与当前 Web 页面的域相同。这意味着浏览器隔离来自不同源的内容,以防止它们之间的操作。这个浏览器策略很旧,从 Netscape Navigator 2.0 版本开始就存在。
克服该限制的一个相对简单的方法是让 Web 页面向它源自的 Web 服务器请求数据,并且让 Web 服务器像代理一样将请求转发给真正的第三方服务器。尽管该技术获得了普遍使用,但它是不可伸缩的。另一种方式是使用框架要素在当前 Web 页面中创建新区域,并且使用 GET
请求获取任何第三方资源。不过,获取资源后,框架中的内容会受到同源策略的限制。
克服该限制更理想方法是在 Web 页面中插入动态脚本元素,该页面源指向其他域中的服务 URL 并且在自身脚本中获取数据。脚本加载时它开始执行。该方法是可行的,因为同源策略不阻止动态脚本插入,并且将脚本看作是从提供 Web 页面的域上加载的。但如果该脚本尝试从另一个域上加载文档,就不会成功。幸运的是,通过添加 JavaScript Object Notation (JSON) 可以改进该技术。
1、什么是JSONP?
要了解JSONP,不得不提一下JSON,那么什么是JSON ?
JSON is a subset of the object literal notation of JavaScript. Since JSON is a subset of JavaScript, it can be used in the language with no muss or fuss.
JSONP(JSON with Padding)是一个非官方的协议,它允许在服务器端集成Script tags返回至客户端,通过javascript callback的形式实现跨域访问(这仅仅是JSONP简单的实现形式)。
2、JSONP有什么用?
由于同源策略的限制,XmlHttpRequest只允许请求当前源(域名、协议、端口)的资源,为了实现跨域请求,可以通过script标签实现跨域请求,然后在服务端输出JSON数据并执行回调函数,从而解决了跨域的数据请求。
3、如何使用JSONP?
下边这一DEMO实际上是JSONP的简单表现形式,在客户端声明回调函数之后,客户端通过script标签向服务器跨域请求数据,然后服务端返回相应的数据并动态执行回调函数。
HTML代码 (任一 ):
Html代码
或者
Html代码
JavaScript的链接,必须在function的下面。
服务端PHP代码 (services.php):
Php代码
如果将上述JS客户端代码用jQuery的方法来实现,也非常简单。
$.getJSON
$.ajax
$.get
客户端JS代码在jQuery中的实现方式1:
Js代码
客户端JS代码在jQuery中的实现方式2:
Js代码
客户端JS代码在jQuery中的实现方式3:
Js代码
其中 jsonCallback 是客户端注册的,获取 跨域服务器 上的json数据 后,回调的函数。
http://crossdomain.com/services.php?callback=jsonpCallback
这个 url 是跨域服务 器取 json 数据的接口,参数为回调函数的名字,返回的格式为
Js代码
Jsonp原理:
首先在客户端注册一个callback, 然后把callback的名字传给服务器。
此时,服务器先生成 json 数据。
然后以 javascript 语法的方式,生成一个function , function 名字就是传递上来的参数 jsonp.
最后将 json 数据直接以入参的方式,放置到 function 中,这样就生成了一段 js 语法的文档,返回给客户端。
客户端浏览器,解析script标签,并执行返回的 javascript 文档,此时数据作为参数,传入到了客户端预先定义好的 callback 函数里.(动态执行回调函数)
使用JSON的优点在于:
JSON也有一些劣势:
尽管如此,JSON的优点还是很明显的。他是Ajax数据交互的很理想的数据格式。
主要提示:
JSONP 是构建 mashup 的强大技术,但不幸的是,它并不是所有跨域通信需求的万灵药。它有一些缺陷,在提交开发资源之前必须认真考虑它们。
第一,也是最重要的一点,没有关于 JSONP 调用的错误处理。如果动态脚本插入有效,就执行调用;如果无效,就静默失败。失败是没有任何提示的。例如,不能从服务器捕捉到 404 错误,也不能取消或重新开始请求。不过,等待一段时间还没有响应的话,就不用理它了。(未来的 jQuery 版本可能有终止 JSONP 请求的特性)。
JSONP 的另一个主要缺陷是被不信任的服务使用时会很危险。因为 JSONP 服务返回打包在函数调用中的 JSON 响应,而函数调用是由浏览器执行的,这使宿主 Web 应用程序更容易受到各类攻击。如果打算使用 JSONP 服务,了解它能造成的威胁非常重要。
三:删除左右两边的空格trim
js中却没有trim()/ltrim()和rtrim()内置方法,所以需要自己写
写成类的方法格式如下:(str.trim();)
写成函数可以这样:(trim(str))
四:js变量声明与赋值以及函数声明
if (!("a" in window)) {
var a = 1; }
alert(a);
结果:undefined
分析: 首先,所有的全局变量都是window的属性,语句 var a = 1;等价于window.a = 1;
第二,所有的变量声明都在范围作用域的顶部,如:
alert("a" in window);
var a;
相当于:
var a;
alert("a" in window);
这是因为JavaScript引擎首先会扫墓所有的变量声明,然后将这些变量声明移动到顶部。
第三,你需要理解该题目的意思是,变量声明被提前了,但变量赋值没有,因为这行代码包括了变量声明和变量赋值。
当变量声明和赋值在一起用的时候,JavaScript引擎会自动将它分为两部以便将变量声明提前,不将赋值的步骤提前是因为他有可能影响代码执行出不可预期的结果。
所以上面的代码就相当于:
var a;
if (!("a" in window)) { 为false
a = 1; }
alert(a); 所以为undefined
例子2:
var num = 100;
function fn(){
var num = num + 1; //var num=window.num+1;正确,此时才外外面的全局变量num
return num;
}
falert(n());答案是NaN
因为在函数体内部首先把var num提前,这样在赋值的时候去的num + 1中的值是undefined,这样进行运算后答案就是NaN,
记住我们找对象的时候是层级往上面找的,找不到才找外面的。
例子3:
var b = (function(){
function fn(){
return 1;
}
return fn();
function fn(){
return 2;
}
var fn;
fn = 3
})();
alert(b);答案是2,
因为首先把var fn提前,然后函数体那样子定义也是一种函数的声明(需要提前),并且同名函数后面覆盖前面的,所以就是var ,fn,fn,然后就renturn了,没有走之后的fn=3,所以答案就是2
代码等价于:
var b = (function(){
var fn;
function fn(){
return 2;
}
return fn();
fn = 3
})();
所以输出2
五:使用递归,计算斐波那契数列
使用递归,计算斐波那契数列
function fib(num) { if (num > 2) { return fib(num - 2) + fib(num - 1); } else { return 1; } } fib(6)
运行过程
1. return fib(4)+fib(5)
2.return fib(2)+fib(3)+fib(3)+fib(4)
3.return 1+fib(1)+fib(2)+fib(1)+fib(2)+fib(2)+fib(3)
4.return 1+1+1+1+1+1+fib(1)+fib(2)
5.return 1+1+1+1+1+1+1+1=8
所以结果为8
函数表达式定义函数时,若带上函数名,则函数名只在函数内部有效,
作用:递归调用本身
var sum = function x(num){
if(num>2){
return x(num-2)+x(num-1);
}else{
return 1;
}
}
sum(6)
x(5) //x is not defined
六:JS函数与call()apply()详解
JavaScript中的每个函数都是一个对象。
因为函数都是对象,它们有自己的属性和方法。我们可以把它们看作数据(data)。
函数和方法的区别?
函数立足于它们自己(例如:alert()),
而方法是函数内部一个对象的属性(dictionary),我们通过对象来调用方法。
每个JavaScript函数都会有很多附属的(attached)方法,包括toString()、call()以及apply()。
定义了一个全局函数f()。f()通过this关键字访问变量x,
var x = 10; function f(){ alert(this.x); } f(); function p(){ var x=100; alert(x); } p();
注意:我们不能通过一个对象的实例来调用这个函数。
this指向的是什么对象呢?this会指向这个全局对象。我们的变量x就是在这个全局对象中定义的。
上面的代码能够正常运行,运行结果会显示一个对话框,对话框中显示10。 第二个函数 输出100,函数内部属性
js里call函数改变对象指针,指向另一个对象调用
var x = 10; var o = { x : 15}; function f(){ alert(this.x); } f(); f.call(o);
首先调用f()将会显示10的对话框,因为this这个时候指向的是全局对象。
然后我们调用f函数的call()方法,传入的参数是o,运行结果显示的是o中x属性的值15。
call()方法会用它的第一个参数作为f函数的this指针。也就是说,我们会告诉运行时,f函数中的this指向的是哪个对象。
call传入参数
call函数实现对象继承
c2对象可以具有了 Class对象的所有方法
apply()函数
对于apply和call两者在作用上是相同的,但两者在参数上有区别的。
对于第一个参数意义都一样,但对第二个参数:
apply传入的是一个参数数组,也就是将多个参数组合成为一个数组传入,而call则作为call的参数传入(从第二个参数开始)。
如 func.call(func1,var1,var2,var3)
对应的apply写法为:func.apply(func1,[var1,var2,var3])
七:window.clearInterval与window.setInterval的用法 定时器的设置
window.setInterval()
功能:按照指定的周期(以毫秒计)来调用函数或计算表达式。
语法:setInterval(code,millisec)
code:在指定时间到时要执行的JavaScript代码串或函数。
millisec:设定的定时时间,用毫秒数表示。
返回值:定时器的ID值,可用于clearInterval()方法停止指定的定时器。
注:setInterval()方法会不停地调用函数,直到用clearInterval()终止定时或窗口被关闭。
window.clearInterval()
功能:取消由setInterval()方法设置的定时器。
语法:clearInterval(id_of_setinterval)
解释:id_of_setinterval:由setInterval()返回的ID值。该值标识了一个setInterval定时器。
也就是:window.setInterval()返回的就是window.clearInterval的参数
恭喜您 注册成功!页面将在 5 秒内自动跳转到 微信首页
八:JS indexOf() lastIndexOf()与substring()截取字符串的区别
1. String.IndexOf 方法 (value[,startIndex])
value:要查找的 Unicode 字符。 必选项
startIndex:搜索起始位置。 可选项 不写从开头查找
该方法返回一个整数值,
指出 String 对象内子字符串的开始位置(如果没有设置第二个索引参数,从下标0开始计算)。如果没有找到子字符串,则返回 -1。
2.String.LastIndexOf(char,int)
char :要查找的字符串
int:在指定范围内查找
该方法返回一个整数值,
指出 String 对象内子字符串最后一次出现的索引位置(从下标0开始计算)。如果没有找到子字符串,则返回 -1。
如果设置第二个参数,则表示在指定范围内最后一次出现的索引位置
例如:
string="hello nihao a!"
string.LastIndexOf('nihao'); 返回 6
string.LastIndexOf('nihao',5); 返回 -1
string.LastIndexOf('nihao',8); 返回 6
在指定的范围内查找字符,这个范围是上面的输入的参数,理解为,从索引0开始到指定的数值位置范围内查找最后一个匹配的的字符串的位置。
实例:location.href.lastIndexOf("?") == -1 在当期url中查找?最后一次出现的位置�在在
3.String.substring(indexstar[,indexend])
可以只写一个参数:表示从索引值开始(起始位置为0)截取后面的字符串
写两个参数:表示截取指定索引开始到指定索引结束之间(不包括结束索引)的字符串
string="Liming is a good boy"
string.substring(3); 返回:ing is a good boy
string.substring(3,6); 返回:ing 即下标3开始到下标5结束的字符串
综合实例:截取当前url中最后文件名包括后缀
url = location.href.lastIndexOf("?") == -1 ? location.href.substring((location.href.lastIndexOf("/")) + 1) :
location.href.substring((location.href.lastIndexOf("/")) + 1, location.href.lastIndexOf("?"));
如果不传参:找到最后一个反斜杠,截取后面的字符串
如果传参:截取最后一个反斜杠到?的字符串
九:window.location.href问题,点击,跳转到首页
onClick="window.location.href='./';" 点击,跳转到首页。
location.href=url Js中实现跳转
window.location.href跳转新窗口
window.location.href="http://cwhois.cnnic.cn/validatecode/validate.jsp?value="+strName+"&entity=domain&service=/whois&inputfield=value";
这段JS代码打开的是本页面
window.open("http://cwhois.cnnic.cn/validatecode/validate.jsp?value="+strName+"&entity=domain&service=/whois&inputfield=value); �在在新创阔在新 在新窗口中打开
window.location方法获取URL
统一资源定位符 (Uniform Resource Locator, URL)
完整的URL由这几个部分构成:
scheme://host:port/path?query#fragment
scheme:通信协议
常用的http,ftp,maito等
host:主机
服务器(计算机)域名系统 (DNS) 主机名或 IP 地址。
port:端口号
整数,可选,省略时使用方案的默认端口,如http的默认端口为80。
path:路径
由零或多个"/"符号隔开的字符串,一般用来表示主机上的一个目录或文件地址。
query:查询
可选,用于给动态网页(如使用CGI、ISAPI、PHP/JSP/ASP/asp.net等技术制作的网页)传递参数,可有多个参数,用"&"符号隔开
,每个参数的名和值用"="符号隔开。
fragment:信息片断
字符串,用于指定网络资源中的片断。例如一个网页中有多个名词解释,可使用fragment直接定位到某一名词解释。(也称为锚点.)
示例:
http://www.home.com:8080/windows/location/page.html?ver=1.0&id=timlq#love
1, window.location.href
整个URl字符串(在浏览器中就是完整的地址栏)
返回值:http://www.home.com:8080/windows/location/page.html?ver=1.0&id=timlq#love
2,window.location.protocol URL 的协议部分
返回值:http:
3,window.location.host URL 的主机部分,
返回值:www.home.com
4,window.location.port URL 的端口部分。如果采用默认的80端口(update:即使添加了:80),那么返回值并不是默认的80而是空字符。
本例返回值:8080
5,window.location.pathname URL 的路径部分(就是文件地址)
返回值:/windows/location/page.html
6,window.location.search 查询(参数)部分。除了给动态语言赋值以外,我们同样可以给静态页面,并使用javascript来获得相信应的参数值
返回值:?ver=1.0&id=timlq
7,window.location.hash 锚点
返回值:#love
方法:
1.window.location.reload()
刷新当前页面。
十:表单数据校检方法 onsubmit()的使用?
在项目中为一个表单(from)编写onsubmit()脚本的时候,经常需要验证表单中数据的合法性
所以常会写道:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
就相当于
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
这样的话你就覆写了(override)其默认方法(默认返回true)大家注意到方法体中可以用this这个关键词,这里即代表了
经过这样的分析后,以上情况就不难理解了:
1 |
|
1 2 3 4 5 |
|
在这里submitTest()虽然返回false,但我们只执行了此函数,没有对其结果进行任何处理。而
1 |
|
override方法的效果为:
1 2 3 4 5 |
|
这样,我们利用到了它的返回值,达到了预期效果。
其实form中有一个方法是对form表单中的数据进行校验.但是需要点击submit按钮才能触发这个校验
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
|
2.在js中调用onsubmit方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|
注意:onsubmit事件在提交数据成功后触发,即在出发action之后触发
在javascript中定义一个函数: function f(){ return false; }
onsubmit事件在提交数据成功后触发,你如果要阻止提交的话可以这样: 这样在提交前就阻止了点击事件
十一:
在 break,continue和return 三个关键字中, break,continue是一起的,return 是函数返回语句,但是返回的同时也将函数停止
break和continue:
退出循环或者switch语句,在其他地方使用会导致错误
break:
举例:
for(var i=1;i<=10;i++)
{
if(i==6)
{
break;
}
document.write(i);
} //输出结果:12345
当i=6的时候,直接退出for这个循环。这个循环将不再被执行!
continue:
和break语句相似。所不同的是,它不是退出一个循环,而是开始循环的一次新迭代。continue语句只能用在while语句、do/while语句、for语句、或者for/in语句的循环体内,在其它地方使用都会引起错误!
举例:
for(var i=1;i<=10;i++)
{
if(i==6) continue;
document.write(i);
} //输出结果:1234578910
当i=6的时候,直接跳出本次for循环。下次继续执行。
return语句:
return语句就是用于指定函数返回的值。
return语句应用范围只能出现在函数体内,出现在代码中的其他任何地方都会造成语法错误!
首先在js中,我们常用return false来阻止提交表单或者继续执行下面的代码,通俗的来说就是阻止执行默认的行为
总之:return false 只在当前函数有效,不会影响其他外部函数的执行。
一、返回控制与函数结果,
语法为:return 表达式; 语句结束函数执行,返回调用函数,而且把表达式的值作为函数的结果
二、返回控制,
无函数结果,语法为:return; 退出函数
在大多数情况下,为事件处理函数返回false,可以防止默认的事件行为.
例如,默认情况下点击一个元素,页面会跳转到该元素href属性指定的页. Return False 就相当于终止符,Return True 就相当于执行符。
在js中return false的作用一般是用来取消默认动作的。比如你单击一个链接除了触发你的 onclick时间(如果你指定的话)以外还要触发一个默认事件就是执行页面的跳转。所以如果 你想取消对象的默认动作就可以return false。
例如:
单击超链接后会跳转到新浪而不会跳转到百度,如果没有renturn false 则会跳转到百度
十二:
javascript是一门解释性语言,自然没有编译过程,但在脚本执行之前会有语法检查和执行环境的构建,我们把这一过程姑且称为预处理吧。
一、函数声明,javaScript解析器把函数提升
fn(); //output 2
var fn= function(){
console.log(1);
}
function fn(){
console.log(2);
}
fn(); //output 1
首先,后面的fn()函数声明提前,所以第一个fn() 为2
其次,后面定义的fn()覆盖前面声明的函数,所以后面执行的函数为字面两定义的函数,结果为1
函数定义、函数声明、arguments三者优先级?
function fn(t){
t(); @1 var t
function t(){ @2.var t=function(){console.log(1)}
console.log(2); @3.var t=function(){consol.log(2)};
} @4.t();
var t = function(){
console.log(3);
}
console.log(t);
}
fn(function(){console.log(1)}); //output 2
//output function(){console.log(3);}
@1.变量声明var t提升到最顶端
@2.arguments中变量首先会覆盖var方式声明的变量(变量声明提升)
@3.函数声明覆盖相同名字的变量
优先级:函数形参>函数声明>变量声明(当变量声明遇到已经有同名的时候,不会影响已经存在的属性)
函数形参---->由名称和对应值组成的一个变量对象被创建,如果没有传递对应参数的话,那么由名称和undefined值组成的一种变量对象的属性也被创建
函数声明---->由名称和对应值(函数对象)组成的一个变量对象的属性被创建,如果变量对象已经存在相同的名称属性,则完全替换这个属性
变量声明---->由名称和对应值(undefined)组成一个变量对象的属性被创建,如果变量名称跟已经声明的形式参数或函数相同,则变量声明不会干扰已经存在的对象
function aa(a,b,c){ @1.a=1 b=2 c=3 @2.a=function a(){} @3.var a; var aa变量声明提升
function a(){}
console.log(a);
console.log(aa);
console.log(arguments);
var a='ee';
var aa='444';
arguments=6;
console.log(a);
console.log(aa);
console.log(arguments);
}
aa(1,2,3);
输出结果:
function a(){}
undefined
[function, 2, 3]
ee
444
6