(九)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 ...
随机推荐
- Flink学习笔记-支持的数据类型
说明:本文为<Flink大数据项目实战>学习笔记,想通过视频系统学习Flink这个最火爆的大数据计算框架的同学,推荐学习课程: Flink大数据项目实战:http://t.cn/EJtKh ...
- Python: 安装 sklearn 包出现错误的解决方法
今天在安装 Python 的 sklearn 包时出现了 Cannot uninstall 'numpy' 和 Cannot uninstall 'scipy' 错误,下面记录了我尝试了很多网上的方法 ...
- NorFlash基础
1. Nor Flash 简介 Nor Flash 闪速存储器具有可靠性高.随机读取速度快的优势,在擦出和编程操作较少而直接执行代码的场合,尤其是纯代码存储的应用中广泛使用. 2. Nor Flash ...
- 一个基于QT简单登录对话框(带验证码功能)
1. 对话框样式 2. 源代码 ①. main.cpp #include <QtGui/QApplication> #include "QLoginDialog.h" ...
- 阿里云 Ubuntu14.04 部署 LAMP
1.更新软件源 sudo apt-get update 2.安装Apache sudo apt-get install apache2 3.查看Apache是否安装成功 apache2 –v 如下所示 ...
- esper(2)-事件类型
1.pojo package com.ebc.eventtype.pojo.pojo1; import cn.hutool.core.collection.CollUtil; import com.e ...
- caffe 图片数据的转换成lmdb和数据集均值(转)
转自网站: http://blog.csdn.net/muyiyushan/article/details/70578077 1.准备数据 使用dog/cat数据集,在训练项目根目录下分别建立trai ...
- 手工安装XDB 组件in oracle 11g
#############. sample 1 install guide below step is only for oracle 11g database installation, 10g d ...
- python 之django (一) Windows环境下Django 1.6.11开发环境搭建(简易版)
转自 https://www.cnblogs.com/kkddij/p/4397163.html 需要安装如下部件: python 2.6.6 pip(最新版即可) Django 1.6.11 PyC ...
- 转 python 随机走动的模拟
https://blog.csdn.net/python2014/article/details/21231971 麻省理工的随机走动模块,还不错,三天搞懂了,不过懂得不彻底. 记录下修改的代码 ...