JavaScript基础内容中的函数详解
函数
函数:即方法
函数就是一段预先设置的功能代码块,可以反复调用,根据输入参数的不同,返回不同的值。
为什么使用函数:
1.方便调用
2.代码重用,利于维护
3.便于修改,便于重构
4.简化逻辑,利于编程
1、声明函数
声明函数 Function Declaration 的三种方法
1)function 命令
function print(s) {
document.write(s+"<br/>");
}
2)函数表达式
var printStr =function(str){
document.write(str+"<br/>");
}
这种写法将一个匿名函数赋值给变量。这时,这个匿名函数又称函数表达式(Function Expression),因为赋值语句的等号右侧只能放表达式。
3)Function 构造函数 : 入门级别用的不多….
var add = new Function('x','y','return (x + y)');
// 等同于
function add(x, y) {
return (x + y);
}
var foo = new Function(
'return "hello world"'
);
// 等同于
function foo() {
return "hello world";
}
注意:不能在条件语句中声明函数
函数名的提升
JavaScript 引擎将函数名视同变量名,所以采用 function 命令声明函数时,整个函数会像变量声明一样,被提升到代码头部。所以,下面的代码不会报错。
f();
function f() {}
表面上,上面代码好像在声明之前就调用了函数 f。但是实际上,由于“变量提升”,函数 f 被提升到了代码头部,也就是在调用之前已经声明了。但是,如果采用赋值语句定义函数,JavaScript 就会报错。
f();
var f = function (){};// TypeError: undefined is not a function
2、函数的调用
函数的调用:圆括号运算符
函数名([实参]);
存在返回值可以变量接收
print()
printStr("goodgoodstudy");
var result =add(1,2);
3、参数
参数: 形参与实参 函数运行的时候,有时需要提供外部数据,不同的外部数据会得到不同的结果,这种外部数据就叫参数。"种瓜得瓜种豆得豆",使用时实参可以省略。
function square(x) { //x 为形参
return x * x;
}
square(2) // 4 2 为实参
square(3) // 9
function f(a, b) {
return a;
}
//实参可以省略
f(4, 2, 3) // 1
f(10) // 1
f() // undefined
同名参数:取最后的一个
function f(a, a) {
console.log(a);
}
f(1, 2) // 2
默认值:使用 || 或运算
function f(a){
a = a || 1;
return a;
}
f('') // 1
f(0) // 1
//更精确写法
function f(a){
(a !== undefined && a !== null) ? a = a : a = 1;
return a;
}
值传递(passes by value):值的副本
var box= 2;
function f(a) {
a = 3;
}
f(box);
console.log(box) // 2 没有改变
//思考 对象值的改变
var obj = {p: 1};
function f(o) {
o.p = 2;
}
f(obj);
console.log(obj.p) // 2
//思考
var obj = [1, 2, 3];
function f(o){
o = [2, 3, 4];
}
f(obj);
console.log(obj) // [1, 2, 3]
arguments 对象: 获取所有的参数,可以看成数组。由于 JavaScript 允许函数有不定数目的参数,所以我们需要一种机制,可以在函数体内部读取所有参数。这就是 arguments 对象的由来。
var f = function(a) {
for(var i in arguments){
console.log(arguments[i]);
}
}
f(1,2,3);
了解: callee
var add =function(){
//获取调用者
console.log(arguments.callee === add); //是否为自己调用
}
add();
4、 return 语句
是函数的返回值。return 语句不是必需的,如果没有的话,该函数就不返回任何值,或者说返回 undefined。
5、递归( recursion)
函数自己调用自身
函数头:尽头 函数体:重复执行
function print(num){
if(num==10){ //递归头
return ;
}
//递归体
console.log(num);
print(num+1);
}
print(1);
6、函数的地位
函数的地位是第一等公民
函数与其他数据类型完全是平等的,所以又称函数为第一等公民
function add(x, y) {
return x + y;
}
// 将函数赋值给一个变量
var operator = add;
// 将函数作为参数和返回值
function a(op){
return op;
}
a(operator)(1, 1)// 2
7、函数的属性和方法
name:函数名
length:参数个数
toString(): 返回源码
8、函数作用域
函数作用域:全局(global variable)和局部(local variable)
var a =1; //全局变量
function display(){
var b=2; //局部变量
c =3; //没有 var 为全局变量 ,调用完成后 c 就存在了
console.log(a+"-->"+b);
}
display();
//b 不能访问
console.log(a+"-->"+c);
就近原则:
var v = 1;
function f(){
var v = 2;
console.log(v);
}
f(); // 2
console.log(v); // 1
变量提升
function foo(x) {
if (x > 100) {
var tmp = x - 100;
}
}
//等同于
function foo(x) {
var tmp;
if (x > 100) {
tmp = x - 100;
};
}
函数本身的作用域:函数本身也是一个值,也有自己的作用域。它的作用域绑定其声明时所在的作用域。
var a = 1;
var x = function (){
console.log(a);
};
function f(){
var a = 2;
x();
}
f() // 1
9、方法的调用
方法的调用: apply call :调用一个对象的一个方法,以另一个对象替换当前对象。二者的区别在于参数是否为数组
function Animal(age){
this.name = "Animal";
this.showName = function(){
alert(this.name);
}
}
function Cat(){
this.name = "Cat";
}
var animal = new Animal();
var cat = new Cat();
//通过 call 或 apply 方法,将原本属于 Animal 对象的 showName()方法交给对象 cat 来使用了。
//输入结果为"Cat"
animal.showName.call(cat,"10");
// 等同于apply方法中参数为数组
animal.showName.apply(cat,[10]);
10、 eval
执行字符串,将字符串当作语句执行。
eval('var a = 1;');
alert(a); // 1
了解 jsonp 的使用:
var jsonp = 'foo({id:42})';
var f = new Function( "foo", jsonp );
// 相当于定义了如下函数
/*
function f(foo) {
foo({id:42});
}*/
//业务处理
var print=function(json){
console.log( json.id ); // 42
}
f(print);
//相当于
function f(print){
json = {id:42};
// print(json);
console.log(json.id);
}
上面代码中,jsonp 是一个字符串,Function 构造函数将这个字符串,变成了函数体。调用该函数的时候,jsonp 就会执行。这种写法的实质是将代码放到函数作用域执行,避免对全局作用域造成影响。(上海尚学堂,原文首发至:公众号 嗨码歌)
JavaScript基础内容中的函数详解的更多相关文章
- JavaScript正则表达式详解(二)JavaScript中正则表达式函数详解
二.JavaScript中正则表达式函数详解(exec, test, match, replace, search, split) 1.使用正则表达式的方法去匹配查找字符串 1.1. exec方法详解 ...
- 【转】linux 中fork()函数详解
在看多线程的时候看到了这个函数,于是学习了下,下面文章写的通俗易懂,于是就开心的看完了,最后还是很愉快的算出了他最后一个问题. linux 中fork()函数详解 一.fork入门知识 一个进程,包括 ...
- Linux中fork()函数详解(转载)
linux中fork()函数详解 一.fork入门知识 一个进程,包括代码.数据和分配给进程的资源.fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事, ...
- C++中重载函数详解
函数的重载详解 什么时函数重载: 函数重载是指在同一作用域内,可以有一组具有相同函数名,不同参数列表的函数,这组函数被称为重载函数.重载函数通常用来命名一组功能相似的函数,这样做减少了函数名的数量,避 ...
- php中magic_quotes_gpc函数详解
magic_quotes_gpc函数在php中的作用是判断解析用户提示的数据,如包括有:post.get.cookie过来的数据增加转义字符“\”,以确保这些数据不会引起程序,特别是数据库语句因为特殊 ...
- python unittest框架中addCleanup函数详解
接上一篇doCleanups说明,这次介绍下另一个很好用的函数:addCleanup 还是老规矩,看官方文档说明: addCleanup(function, *args, **kwargs)¶ Add ...
- python中groupby函数详解(非常容易懂)
一.groupby 能做什么? python中groupby函数主要的作用是进行数据的分组以及分组后地组内运算! 对于数据的分组和分组运算主要是指groupby函数的应用,具体函数的规则如下: df[ ...
- Linux C 中 fork() 函数详解
一.fork入门知识 一个进程,包括代码.数据和分配给进程的资源.fork() 函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同 ...
- JQuery中on()函数详解
JQuery API中定义的on方法,专业名词很多,读起来并不是那么容易,而对于开发人员知道函数怎么使用就可以了.本文将JQuery的说明翻译如下: on(events,[selector],[dat ...
随机推荐
- idea启动java项目,使用调试会占用更多内存
idea启动java项目,使用调试会占用更多内存
- Spring---SSH整合(二)
基于Spring---SSH整合,使用SSH编写后台: User模块层 TreeNode.hbm.xml <?xml version="1.0" encoding=" ...
- 深入js系列-类型(显式强制转换)
什么是显式 这里的显式和隐式是以普遍的标准来进行讨论的,你能看出来是怎么回事,那么它对你是"显式",相反你不知道的话,对你就是"隐式" 抽象操作 字符串.数字. ...
- luoguP2039 [AHOI2009]跳棋 巧妙的dp
设\(f[i]\)表示在第\(i\)个格子上弄一个棋子的最小代价,前后扫两遍dp后统计答案即可. 代码 #include<bits/stdc++.h> using namespace st ...
- python爬虫实例——爬取歌单
学习自<<从零开始学python网络爬虫>> 爬取酷狗歌单,保存入csv文件 直接上源代码:(含注释) import requests #用于请求网页获取网页数据 from b ...
- 【BigData】Java基础_ArrayList的使用
ArrayList概述 ArrayList底层使用的是数组.是List的可变数组实现,这里的可变是针对List而言,而不是底层数组. 数组有自身的特点,不变性,一旦数组被初始化,那么其长度就固定了,不 ...
- html中利用flex容器书写的布局样式
首先页面基本样式见下图: 如有兴趣可以打开https://migloo.gitee.io/front 或者 https://www.igloo.xin/front 进行查看
- Kubeadm部署安装kubernetes1.12.1
1.环境准备(这里是master) CentOS 7.6 两台配置如下,自己更改主机名,加入hosts, master和node 名字不能一样 # hostname master # hostname ...
- 解析XML数据
在 Java 程序中读取 XML 文件的过程称为解析 XML 解析 XML 文件的方式 1) DOM 解析 (java 官方提供) 2) SAX 解析(java 官方提供) 3) JDOM 解析(第三 ...
- linux部署go
一.下载tar包并解压 yum -y install wget glibc.i686 #后面一个是依赖包,不安装会报错: /lib/ld-linux.so.2: bad ELF interpreter ...