(九)JavaScript之【JS函数(定义、参数、调用、【闭包】、call(),apply())】[较深,胆小勿进]
一】、定义:
/**
* 函数表达式
*
* Function() 构造函数
*
* 函数提升(Hoisting)
* JavaScript默认将当前作用域提升到前面去
* Hoisting应用在变量的声明和函数的声明
* 【使用表达式定义函数时无法提升】
*
* 自调用函数
*
* 函数是对象*/
//函数表达式储存在变量中
var x = function () { return 'message'; }; console.log(x()); /**
以上函数实际上是一个 匿名函数 (函数没有名称)。
函数存储在变量中,不需要函数名称,通常通过变量名来调用。
上述函数以分号结尾,因为它是一个执行语句。
*/
//不建议。在 JavaScript 中,很多时候,你需要避免使用 new 关键字。
var myFunction = new Function('a', 'b', 'return a*b');
console.log(myFunction(3, 4));
//函数提升
//在函数声明之前调用
myFunction(); function myFunction() {
console.log(233);
}
//自调用函数,是一个表达式,有括号把表达式括起来
(function () {
console.log('Hello'); //我将调用我自己
})();
//函数是对象,函数有属性和方法
console.log(typeof(function add() {})); //function //arguments.length 属性返回函数调用过程接收到的参数个数
//arguments是JavaScript的内置对象
function myFunction(a, b){
console.log(arguments.length);
} myFunction(1, 2); //
myFunction(); //
myFunction('test'); // //总结:
//函数定义作为对象的属性,称之为对象方法。
//函数如果用于创建新的对象,称之为对象的构造函数。
二】、参数
/**
* 函数参数
*
* arguments 对象
* arguments对象包含了函数调用的参数数组
* */ /**
* 如果函数在调用时缺少参数,参数会默认设置为: undefined
有时这是可以接受的,但是建议最好为参数设置一个默认值*/
function add(x, y){
if(y === undefined) {
y = 0;
}
//或者:
//y = y || 0;
//如果y已经定义 , y || 返回 y, 因为 y 是 true, 否则返回 0, 因为 undefined 为 false。
console.log( x + y);
} add(2);
console.log(Boolean(undefined)); //false
//查找最后一个参数的值
function findMax() {
var maxNum = 0; for(var i = 0;i < arguments.length;i++) {
if(arguments[i] > maxNum) {
maxNum = arguments[i];
}
}
console.log(maxNum);
}
findMax(4,5,6); //
function sumAll() {
var sum = 0; for(var i = 0;i < arguments.length;i++) {
sum += arguments[i];
}
console.log(sum);
}
sumAll(4,5,6); //
三】、调用
/**
* 函数的调用:
*
* 1.作为一个函数调用
*
* 2.作为对象的方法调用
*
* 3.构造函数new调用函数
*
* 4.call()、apply()调用函数
* call([thisObj[,arg1[, arg2[, [,.argN]]]]])
* call 方法可以用来代替另一个对象调用一个方法。call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。
如果没有提供 thisObj 参数,那么 Global 对象被用作 thisObj。 */ var myObject = {
myName: 'lqc',
myPets: ['HuaDou', 'ErBao'],
fullInformation: function () {
return this.myName + ' have ' + this.myPets[1];
}
}; console.log(myObject.fullInformation()); function multiply(a, b) {
return a*b;
} console.log(multiply.call(myObject, 5, 6));
console.log(multiply.apply(myObject, [5, 6]));
四】、闭包
闭包:
私有变量可以用到闭包
// 计数菌
var add = (function (){
var counter = 0; return function () {
return counter++;
}; })(); console.log(add());
console.log(add());
console.log(add());
//定义多个嵌套函数
function counter() {
var counter = 0; return {
count: function () {
return counter++;
},
reset: function () {
return counter = 0;
}
};
} var c1 = counter();
var c2 = counter(); console.log(c1.count());
console.log(c1.count());
console.log(c1.count()); console.log(c2.count());
console.log(c2.count());
console.log(c2.reset());
五】、call()方法和apply()方法
参考:http://www.cnblogs.com/lqcdsns/p/5349496.html
(九)JavaScript之【JS函数(定义、参数、调用、【闭包】、call(),apply())】[较深,胆小勿进]的更多相关文章
- js函数定义 参数只要写名称就可以了
js函数定义 参数只要写名称就可以了 以下为标准: function add(type) { } 不要写成下面这个样子 function add(var type) { } 哎 妹的 老何ja ...
- js函数定义参数个数和实际传入参数的对比
因为js是一种弱类型的编程语言,对数据类型的要求没有其他编程语言的要求严格,所以在定义函数的时候不需要像java和C#一样对其传入参数的类型进行定义.那么传入参数的个数有没有影响呢?今天小猪就做了个实 ...
- javascript、jQuery函数定义和调用方法
一.javascript 1.var aaa=function(){...} var 方式定义的函数,不能先调用函数,后声明,只能先声明函数,然后调用. 2.function aaa(){...} f ...
- js函数定义和调用
由于JavaScript的函数也是一个对象,上述定义的abs()函数实际上是一个函数对象,而函数名abs可以视为指向该函数的变量. var abs = function (x) { if (x > ...
- js加载事件和js函数定义
一 dom文档树加载完之后执行一个函数 在Dom加载完成后执行函数,下面这三个的作用是一样的,window.onload 是JavaScript的,window.onload是在dom文档树加载完和 ...
- js函数的参数
js函数的参数: js是弱类型的编程语言,调用函数时既不在乎函数的参数,也不在意参数的类型 即便你定义的函数值接受两个参数,在调用这个函数时也未必一定要是两个参数.可以传递一个.三个甚至不传递参数,而 ...
- js 函数定义的方式
js 函数定义的方式 一.总结 一句话总结: 最常见就下面三种 最常见:function func1([参数]){/*函数体*/} 将匿名函数赋值给变量:var func2=function([参数] ...
- js 函数定义三种方式
<p>Js 函数定义的三种方式:</p> <br> <p>方式一:function</p> <script type="te ...
- Linux Shell函数定义与调用
一.Shell函数定义格式 shell函数定义格式,各部分说明如下: [ function ]等中括号括起来部分----表示可选(即可有可无) your_function_name部分----为函数名 ...
- js 函数定义的2种方式
js 函数定义的2种方式 CreateTime--2018年3月29日18:36:14 Author:Marydon 方式一: /** * 函数式声明 */ function mode() { c ...
随机推荐
- export to pdf
first we need to download the link is : http://files.cnblogs.com/akingyao/itextsharp-all-5.4.2.zip t ...
- 线段树 SP1043 GSS1 - Can you answer these queries I
SP1043 GSS1 - Can you answer these queries I 题目描述 给出了序列A[1],A[2],-,A[N]. (a[i]≤15007,1≤N≤50000).查询定义 ...
- CF796A Buying A House 模拟
Zane the wizard had never loved anyone before, until he fell in love with a girl, whose name remains ...
- FMDB----SQL----数据库
#pragma mark -- 数库 - (void)createDatabase{ //路径 NSString *path = [NSString stringWithFormat:@"% ...
- Spring 配置RMI远程调用
项目中遇到了跨系统调用,当初想的是用webservice或者是hessian.但是这个接口用到的并不多,而且是一个非常简单的方法.所有便想到了RMI.在spring中 实现RMI非常简单. 暴露服务: ...
- Ubuntu系统升级遇到问题记录
The upgrade needs a total of 99.7 M free space on disk '/boot'. Please free at least an additional 5 ...
- AngularJS中【Error: [$rootScope:inprog]】的解决办法
AngularJs脏数据检查冲突 Error: [$rootScope:inprog] http://errors.angularjs.org/1.5.8/$rootScope/inprog?p0=% ...
- poj1064 Cable master(二分)
Cable master 求电缆的最大长度(二分法) Description Inhabitants of the Wonderland have decided to hold a region ...
- log4net独立配置文件配置(winfrom)
log4net配置很多,具体配置步骤不细说,具体说出个人遇到的问题. 在winfrom和web应用程序中配置,在默认配置文件配置都没问题,因为EF也写在默认配置文件中,就会冲突解决办法就是将log4. ...
- Problem08 输入数字求和
题目:求s=a+aa+aaa+aaaa+aa...a 的值,其中a 是一个数字.例如2+22+222+2222+22222(此时共有5 个数相加),几个数相加有键盘控制. 程序分析:关键是计算出每一项 ...