js函数与java函数的区别_JS中的函数与方法怎么区别?

你说的所谓函数是类的方法。

a = [1,2,3]

Array.isArray(a) #return true isArray是类Array的方法

你说的所谓的方法就是类所生成对象的方法。

a = [1,2,3]

a.pop() #return 3 pop()是Array类所生成的对象a的方法

这里所谓的类指的是构造函数

之前写的关于函数的笔记,你可以作为个参考。

Function

在JavaScript中,函数是Function类的具体实例。而且都与其它引用类型一样具有属性和方法。函数名实际上是指向函数对象的指针,函数可以作为参数参与到传参和返回值中。

函数定义

//函数声明式定义

function foo(num1,num2){

return num1 + num2;

}

//函数表达式定义

var foo = function(num1,num2){

return num1 + num2;

};

//使用Function构造函数定义

var foo = new Function("num1","num2","return num1 + num2");

//实际上创建一个Function实例并不一定要赋值给具体的指针,可以直接执行

(function(x,y){return x+y})(1,2);

//之所以用圆括号把function(){}括起来是因为js解释器会将function解释为函数声明,而函数声明不能直接跟着(x,y),我们需要将其转换为函数表达式。

//(1,2)表示要传递跟函数的参数。

//上面的例子也可以写成:

function foo(x,y){

return x+y;

}(1,2);

//函数声明的方式无法定义匿名函数,因此如果想使用匿名函数,则必须用函数表达式的定义方式。

函数的对象特性

因为函数是Function的实例,而函数名仅仅是该实例的一个引用地址。因此可以作为参数和返回值参与到函数的传参过程中。

function call_some_function(some_function, some_argument) {

return some_function(some_argument);

}

function add_10(num) {

return num + 10;

}

console.log(call_some_function(add_10,20)); //30

函数的内部属性

arguments | this

arguments对象中保存着传递给函数的参数

arguments.length返回传入参数的个数

Note: length属性表示函数定义时候默认接收的参数数量。arguments.length表示函数实际执行时接收的参数数量。

function test_arguments() {

if (arguments.length == 2) {

console.log(arguments.length);

console.log(arguments);

} else {

console.log(arguments.length);

console.log(arguments);

arguments.callee(4, 5);

};

}(1, 2, 3)

/**

3

{ '0': 1, '1': 2, '2': 3 }

2

{ '0': 4, '1': 5 }

**/

arguments.callee()主要用在递归函数中调用函数自身的情境中。js和别的语言不同在于函数名只是一个指针,可以随时变化,函数中利用函数名来调用自身属于高耦合,可能会出现问题,而arguments.callee()调用自身就会规避掉这个问题

function factorial(num) {

if (num <= 1) {

return 1;

} else {

return num * factorial(num - 1);

};

}

function callee_f(num) {

if (num <= 1) {

return 1;

} else {

return num * arguments.callee(num - 1);

};

}

factorial(10); //运行正常

f = factorial;

factorial = null;

f(10); //error

callee_f(10); //运行正常

f = callee_f;

callee_f = null;

f(10); //运行正常

this主要用来帮助函数引用函数所处作用域中的对象。

var color = 'red';

function syaColor() {

console.log(this.color);

}

syaColor(); //red

var o = new Object();

o.color = 'blue';

o.sayColor = sayColor;

o.sayColor(); //blue

call()和apply()

call()和apply()是每个函数都包含的自有方法。之前已经提到了函数是定义的对象,那么调用函数时候,函数中的this是对当前与下变量的调用。而如果想改变函数执行所在域空间,则可以使用call()和apply()来实现。

color = 'red';

var o = {color: 'blue'};

function sayColor() {

console.log(this.color);

}

sayColor(); //red

sayColor.call(this); //red

sayColor.call(o); //blue

app()和call()的作用是相同的,区别主要在于传入参数的不同。

call(this,para1,prar2,prar3) 第一个参数是函数要执行的作用域,后面的参数是函数的输入参数,有多少个依次写多少个。

apply(this,[para1,para2,prara3])第一个参数也是函数要执行的作用域,后面是一个Array的数组对象。

使用call()/apply()来扩充作用域最大的好处是对象和方法的解耦。

内置对象

Global对象可以理解成最外层的对象,所有的对象,以及不属于其它对象的属性和方法都被包含在Global对象中。

* isNaN(x) 用来检查参数x是否为数字。如果为数字返回false,否则返回true

* isFinite(x) 用来检查参数x是否为无穷大/小,如果是无穷大/小,则返回true

* parseInt(x) 用来解析字符串并返回整数

* parseFloat(x) 用来解析字符串并返回浮点数

* encodeURI()和encodeURIComponent()会对字符串进行特殊的UTF-8编码,规避一些特殊字符来让浏览器能够读懂。他俩的区别主要在于encodeURI()不会对本身属于URI的特殊字符进行编码,而encodeURIComponent()会对其发现的所有非标准字符进行编码。

var uri = "http://www.wrox.com/illegal value.htm#start";

//http://www.wrox.com/illegal%20value.htm#start

console.log(encodeURI(uri))

//http%3A%2F%2Fwww.wrox.com%2Fillegal%20value.htm%23start

console.log(encodeURIComponent(uri))

对应的解码函数为decodeURI()和decodeURIComponent()

eval(script) 用来将script的内容在解释器中执行并返回对应的结果。非常强大!

Note:在浏览器中,windows对象封装了Global对象,并承担了很多额外的任务和功能。

Math对象为另一个内置对象。为JavaScript提供了数学计算功能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值