6.8 js学习笔记

本文详细介绍了JavaScript中的argument对象,包括其callee属性,以及全局函数如encodeURI、decodeURI、escape、unescape和eval的用法与注意事项。此外,还讨论了匿名函数的声明与调用,以及this的引用规则,最后提到了call和apply方法的差异及回调函数的概念。
摘要由CSDN通过智能技术生成

argument

1.Arguments对象

1)作用:用于储存调用函数时的所有实参。
  当调用函数,并用实参赋值时,实际上参数列表已经保存到arguments数组中,可以在函数中,使用arguments[n]的形式调用,n从0开始。
2)arguments数组的个数,取决于实参列表,与形参无关。但是,一旦第n个位置的形参、实参、arguments都存在时,形参将与arguments绑定,同步变化。即,在函数中,修改形参的值,arguments也会改变,反之亦成立。
3)arguments.callee是arguments的重要属性。表示arguments所在函数的引用地址;
在函数里面,可以使用arguments.callee()调用函数本身。
在函数内部,调用函数自身的写法,叫做递归。
递归分为两部分:递和归。以递归调用语句为界限,可以将函数分为上下两部分。
递:当函数执行上半部分。遇到自身的调用语句时,继续进入内层函数,再执行上半部分。直到执行完最内层函数。
归:当最内层函数执行以后,再从最内层函数开始,逐渐执行函数的下半部分。

有了这个对象我们以后写函数的时候,就不用给所有的形参指定参数名,然后通过参数名的方式获取参数了,我们可以直接使用arguments对象来获取实参,我们使用arguments调用参数可以不混淆不同函数之间的参数名,我们也能用arguments来判断当前传入参数的个数是否与我们需要的数量一致

function add() {
	if( arguments.length == 2 ){
		return arguments[0] + arguments[1];
	}else{
		return '传入参数不合法';
	}
}

console.log( add(2,3) );
console.log( add(1,2,3) );

结果为:
在这里插入图片描述

argument的callee属性

简单点说,这个属性里面存储的我们调用的这个函数的代码

function showcallee() {
    var a = '这里是代码';
    var b = '这是另一段代码';
    var c = a + b;
    
    console.log(arguments.callee);
    
    return c;
}
showcallee();

console的结果:
与我们打的代码时一致的
在这里插入图片描述

全局函数

在这里插入图片描述

encodeURI()

😡 该方法不会对 ASCII 字母和数字进行编码,
也不会对这些 ASCII 标点符号进行编码: - _ . ! ~ * ’ ( ) 。

该方法的目的是对 URI 进行完整的编码,因此对以下在 URI 中具有特殊含义的 ASCII 标点符号,encodeURI() 函数是不会进行转义的:;/?: @&=+$,#

<html>
<body>

<script type="text/javascript">

document.write(encodeURI("http://www.w3school.com.cn")+ "<br />")
document.write(encodeURI("http://www.w3school.com.cn/My first/")+ "<br />")
document.write(encodeURI(",/?:@&=+$#"))

</script>

</body>
</html>



结果
在这里插入图片描述

decodeURI()

decodeURIComponent() 函数可对 encodeURIComponent() 函数编码的 URI 进行解码。

返回值

URIstring 的副本,其中的十六进制转义序列将被它们表示的字符替换。

代码样例:


<script type="text/javascript">

var test1="http://www.w3school.com.cn/My first/"

document.write(encodeURIComponent(test1)+ "<br />")
document.write(decodeURIComponent(test1))

</script>

输出:

在这里插入图片描述

escape()

escape() 函数可对字符串进行编码,这样就可以在所有的计算机上读取该字符串。

语法:escape(string)

返回值

已编码的 string 的副本。其中某些字符被替换成了十六进制的转义序列。

说明

该方法不会对 ASCII 字母和数字进行编码,也不会对下面这些 ASCII 标点符号进行编码: * @ - _ + . / 其他所有的字符都会被转义序列替换。

<html>
<body>

<script type="text/javascript">

document.write(escape("Visit W3School.com.cn!") + "<br />")
document.write(escape("?!=()#%&"))

</script>

</body>
</html>

结果:
在这里插入图片描述

unescape()

unescape() 函数可对通过 escape() 编码的字符串进行解码。

返回值

string 被解码后的一个副本。

说明

该函数的工作原理是这样的:通过找到形式为 %xx 和 %uxxxx 的字符序列(x 表示十六进制的数字),用 Unicode 字符 \u00xx 和 \uxxxx 替换这样的字符序列进行解码。

在本例中,我们将使用 escape() 来编码字符串,然后使用 unescape() 对其解码:

<script type="text/javascript">

var test1="Visit W3School!"

test1=escape(test1)
document.write (test1 + "<br />")

test1=unescape(test1)
document.write(test1 + "<br />")

</script>

输出:

Visit%20W3School%21
Visit W3School!

eval()

eval() 函数可计算某个字符串,并执行其中的的 JavaScript 代码。

语法:

eval(string)
返回值

通过计算 string 得到的值(如果有的话)。

说明

该方法只接受原始字符串作为参数,如果 string 参数不是原始字符串,那么该方法将不作任何改变地返回。因此请不要为 eval() 函数传递 String 对象来作为参数。

如果试图覆盖 eval 属性或把 eval() 方法赋予另一个属性,并通过该属性调用它,则 ECMAScript 实现允许抛出一个 EvalError 异常。

抛出

如果参数中没有合法的表达式和语句,则抛出 SyntaxError 异常。

如果非法调用 eval(),则抛出 EvalError 异常。

如果传递给 eval() 的 Javascript 代码生成了一个异常,eval() 将把该异常传递给调用者。

在本例中,我们将在几个字符串上运用 eval(),并看看返回的结果:

<script type="text/javascript">

eval("x=10;y=20;document.write(x*y)")

document.write(eval("2+2"))

var x=10
document.write(eval(x+17))

</script>

输出:

200
4
27

看一下在其他情况中,eval() 返回的结果:

eval("2+3")	// 返回 5
var myeval = eval;	// 可能会抛出 EvalError 异常
myeval("2+3");	// 可能会抛出 EvalError 异常

可以使用下面这段代码来检测 eval() 的参数是否合法:

try  {
     alert("Result:" + eval(prompt("Enter an expression:","")));
     }

catch(exception) {
     alert(exception);
     }

但是为了保证程序的安全性,尽量不使用eval()

匿名函数

1.声明一个匿名函数,直接赋值给某一个事件;
在这里插入图片描述
2.使用匿名函数表达式。将匿名函数,赋值给一个变量。

声明:var func=function(){ }
调用:func();
在这里插入图片描述

注意:使用匿名函数表达式时,函数的调用语句,必须放在函数声明语句之后!!!(与普通函数的区别)
在这里插入图片描述

在这里插入图片描述
this

this引用,引用的是一个对象,对象不同或函数调用方式的不同,this引用会根据代码的上下文语境自动改变引用对象的特性。

引用规则

1,在最外层代码中,this引用引用的是全局对象(windows)

2,在函数内,this引用根据函数调用方式不同而不同

1)在构造函数中,this引用的对象是构造函数生成的对象

2)方法调用,this引用的是接受方对象

3)appl和call调用,引用的对象由两个函数的参数指定

4)其他方式调用,引用的是全局对象

==call方法: ==
语法:call([thisObj[,arg1[, arg2[, [,.argN]]]]])
定义:调用一个对象的一个方法,以另一个对象替换当前对象。
说明:
call 方法可以用来代替另一个对象调用一个方法。call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。
如果没有提供 thisObj 参数,那么 Global 对象被用作 thisObj。

apply方法:
语法:apply([thisObj[,argArray]])
定义:应用某一对象的一个方法,用另一个对象替换当前对象。
说明:
如果 argArray 不是一个有效的数组或者不是 arguments 对象,那么将导致一个 TypeError。
如果没有提供 argArray 和 thisObj 任何一个参数,那么 Global 对象将被用作 thisObj, 并且无法被传递任何参数。

简单来说就是有如下不同

func.call(func1,var1,var2,var3)对应的apply写法为:func.apply(func1,[var1,var2,var3])

回调函数(callback)

 function  a(callback){
      alert('a');
      callback();//或者是 callback(),  callback.apply(this)

   }
   function  b(){
       alert('b');
   }
   //调用
   a(b);

但是多数时候回调函数是有参数的所以应该向下面这样来定义
function  a(callback){
      alert('a');
      callback.call(this,'d');//或者是 callback(),  callback.apply(this)
}
 //调用 

c(function(e){ alert(e); });

自调用函数

在这里插入图片描述

在这里插入图片描述

结果为:
this is a test
8
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值