js学习(4) 函数
JavaScript有三种声明函数的方法
(1)function命令
function print(s) {console.log(s);
}
(2)函数表达式
1.var print = function(s) {console.log(s);
};2.var print = function x(){console.log(typeof x);
};x
// ReferenceError: x is not definedprint()
// function3.var f = function f() {};
将匿名函数赋予变量,如果不匿名,也只在内部有效
函数表达式定义函数最后要加上分号代表结束
(3)Function构造函数
可以传递任意数量的参数给Function构造函数,但只有最后一个参数被当做函数体
Function构造函数可以不使用new命令,返回结果完全一样
var add = new Function('x','y','return x + y'
);// 等同于
function add(x, y) {return x + y;
}
此方法比较不常用 第一种方法倒更熟悉
如果一个函数被多次声明,后面的声明就会覆盖前面的声明
调用函数时和其他语言大致相同,使用圆括号运算符
第一等公民
Js把函数看成一种值,与其他值(数值,字符串,布尔值等)地位相同
凡是可以使用值的地方,就能使用函数,函数只是一个可以执行的值
function add(x, y) {return x + y;
}// 将函数赋值给一个变量
var operator = add;// 将函数作为参数和返回值
function a(op){return op;
}
a(add)(1, 1)
// 2
函数提升
函数的属性和方法
name属性:返回函数名字 如果采用表达式定义函数,且function后有名字,则返回那个名字
length属性:返回函数预期传入的参数个数
toString():返回一个字符串,内容是函数的源码,以及注释
对于var命令来说,局部变量只能在函数内部声明,在其他区块中声明,一律都是全局变量
函数内部也有变量提升,var命令声明的对象,不管在什么位置,变量声明都会被提升到函数体的头部
函数本身的作用域
函数本身作用域就是声明时所在的作用域,与运行时所在作用域无关
在定义时绑定作用域
var a = 1;
var x = function () {console.log(a);
};function f() {var a = 2;x();
}f() // 1
函数的参数
可以省略,但没办法只省略靠前的参数,而保留靠后的参数,如果一定要省略靠前的参数,只有显式传入undefined
参数传递对原值的影响
如果是原始类型的值,无影响,只是一份拷贝
如果传入的是对象,则修改其属性的话,原值会受到影响
但把对象整个替换掉,不会影响原始值,因为相当于指向其他地址
同名参数
如果有同名参数,则取最后出现的那个值
function f(a, a) {console.log(a); //a为最后一个a
}f(1) // undefined 相当于f(1,undefined)
arguments对象
由于js允许函数提供不定数目的参数,所以需要一种机制,可以在函数体内部读取所有参数,这就是arguments对象的由来
arguments对象包含函数运行时所有参数,使用类似数组
如果在非严格模式下还可以在函数内部修改参数的值,严格模式下只读
通过它的length属性,可以判断函数调用时到底带了几个参数
与数组关系:
是对象,不能使用数组方法,除非转换为数组
var args = Array.prototype.slice.call(arguments);// 或者
var args = [];
for (var i = 0; i < arguments.length; i++) {args.push(arguments[i]);
}
arguments自带一个callee属性1,返回它所对应的原函数,可以用这个写递归
arguments每个函数运行时都有,无需显式声明
函数的闭包
闭包即能够读取其他函数内部变量的函数,可以简单理解为“定义在一个函数内部的函数”
用处:1.读取函数内部变量 2.记住诞生的环境
function createIncrementor(start) {return function () {return start++;};
}var inc = createIncrementor(5);inc() // 5
inc() // 6
inc() // 7
3.封装对象的私有属性和方法,感觉像类
function Person(name) {var _age;function setAge(n) {_age = n;}function getAge() {return _age;}return {name: name,getAge: getAge,setAge: setAge};
}var p1 = Person('张三');
p1.setAge(25);
p1.getAge() // 25
立即调用的函数表达式,声明时就调用(IIFE)
(function(){ /* code */ }());
// 或者
(function(){ /* code */ })();
所以以下写法都行
var i = function(){ return 10; }();
true && function(){ /* code */ }();
0, function(){ /* code */ }();
!function () { /* code */ }();
~function () { /* code */ }();
-function () { /* code */ }();
+function () { /* code */ }();
通常只对匿名函数使用
目的:1.不必命名,避免污染全局变量 2。在IIFE内部形成了一个单独的作用域,可以封装一些外部无法读取的私有变量
eval命令
eval命令接受一个字符串作为参数,并将这个字符串当做语句执行
eval('var a = 1;');
a // 1
如果无法执行就报错
如果eval的参数不是字符串,那么会原样返回
eval的作用域是当前作用域,因此小心修改当前作用域变量的值
eval本质是在当前作用域中注入代码,由于安全风险和不利于js引擎优化执行速度,一般不推荐使用
最常用的场合是解析json数据的字符传递,不过正确做法应该使用原生的JSON.parse方法
js规定,凡是使用别名执行eval,eval内部一律是全局作用域
var a = 1;function f() {var a = 2;var e = eval;e('console.log(a)');
}f() // 1
转载于:https://www.cnblogs.com/wtblogwt/p/10030250.html
js学习(4) 函数相关推荐
- 廖雪峰JS学习总结-函数篇
最近在刷廖雪峰的JS教程,把里面的自己不太清楚的东西在刷一遍. 教程网址:www.liaoxuefeng.com/wiki/001434- 函数的定义和调用: 如果没有return语句,函数执行完毕后 ...
- JS学习笔记——入门基础知识总结
JS入门基础知识总结1 前言 基础背景知识 一.产生历史: 二.特点: 三.应用方向: 四.Javascript组成: JavaScript书写使用方式 一.行内式(了解即可,项目中不使用,日常练习尽 ...
- html js 回调函数,js中回调函数的学习笔记
回调函数是什么在学习之前还真不知道js回调函数怎么使用及作用了,下面本文章把我在学习回调函数例子给各位同学介绍一下吧,有需了解的同学不防进入参考. 回调函数原理: 我现在出发,到了通知你" ...
- JS学习笔记(五)函数类型、箭头函数、arguments参数、标签函数
JS学习笔记(五) 本系列更多文章,可以查看专栏 JS学习笔记 文章目录 JS学习笔记(五) 一.函数 1. 函数定义 2. 方法( 对象 + 函数 ) 二.函数参数及返回值 1. 传递原始类型参数 ...
- backbone.js学习笔记
backbone.js学习笔记 之前只接触过jQuery,看来Backbone是除了jQuery的第二大JS框架... backbone到底是个啥? 其实刚开始我也不知道=_=,我是这周二才听说居然还 ...
- node.js学习笔记
# node.js学习笔记标签(空格分隔): node.js---## 一 内置模块学习 ### 1. http 模块 ``` //1 导入http模块 const http =require('ht ...
- 关于js的回调函数的一点看法
关于js的回调函数的一点看法 原文:关于js的回调函数的一点看法 算了一下又有好几个月没写博客了,最近在忙公司android的项目,所以也就很少抽时间来写些东西了.刚闲下来,我就翻了翻之前看的东西.做 ...
- js 字符串操作函数有哪些
js 字符串操作函数有哪些 一.总结 一句话总结:js字符串函数都是字符串对象的方法,是通过调用字符串方法的方式调用,和java,php里面不一样. 1.字符串替换函数怎么用? 这里的正则表示是加双引 ...
- WebGL three.js学习笔记 6种类型的纹理介绍及应用
WebGL three.js学习笔记 6种类型的纹理介绍及应用 本文所使用到的demo演示: 高光贴图Demo演示 反光效果Demo演示(因为是加载的模型,所以速度会慢) (一)普通纹理 计算机图形学 ...
- 基于jquery的插件turn.js学习笔记
基于jquery的插件turn.js学习笔记 简介 turn.js是一个可以实现3d书籍展示效果的jq插件,使用html5和css3来执行效果.可以很好的适应于ios和安卓等触摸设备. How it ...
最新文章
- 专升本c语言程序设计网课_2020年宜春学院专升本招生信息
- 掘金-Markdown 编辑器使用手册
- sublime自定义主题-修改行号的颜色
- android更换工具链
- 你所阅读的,决定你是什么样的人
- centos 6 安装mysql,CentOS6.5安装MySQL教程(完整教程)
- Spring Cloud 入门 之 Ribbon 篇(二)
- Prometheus监控学习笔记之360基于Prometheus的在线服务监控实践
- java兔子问题流程图_C语言编程狼追兔子问题代码解析
- 2021年吉林高考成绩怎么查询,2021年吉林高考成绩排名查询系统,吉林高考位次排名查询...
- Highcharts实现图形报表(我主要实现javaweb开发的图形报表)
- 关于使用UIWebView加载HTTPS站点
- 编程语言-脚本编程-PowerShell相关整理
- 接口与抽象类的相同点和不同点
- MapGIS10.3新功能
- AvalonDock 2.0+Caliburn.Micro+MahApps.Metro实现Metro风格插件式系统(一)
- 马云 996 一文的诡辩与话术:大家是怎么被洗脑还帮人数钱的
- 传奇 定时任务(泡点、时间触发、任务活动等)
- 查看数据库信息(一)
- pdf转换成txt转换器1.2详细教程
热门文章
- 骰子的妙用---课堂答题
- android studio gradle 配置
- Struts+Spring+Hibernate整合入门详解
- Stored Procedure 里的 WITH RECOMPILE 到底是干麻的?
- HDU_2065 红色病毒问题(指数型生成函数)
- asp.net performance
- svn trunk branches tags 的用法
- 【Linux 内核】编译 Linux 内核 ④ ( 打开 Linux 内核编译 菜单配置 |菜单配置中的光标移动与选中状态 | 保存配置 | 配置项帮助文档 )
- 【Android 安装包优化】WebP 应用 ( 4.0 以下兼容 WebP | Android Studio 中使用 libwebp.so 库向下兼容版本 | libwebp 库测试可用性 )
- Mac 完全卸载 Java