当前位置:首页 > 日记 > 正文

学好js,这些js函数概念一定要知道【推荐】

学好js,这些js函数概念一定要知道【推荐】

函数创建方式

 1.声明方式 例如:function consoleTip (){ console.log("tip!"); }

 2.表达式方式 例如:var consoleTip = function(){ console.log("tip!"); }

两种方式的区别:

 1.表达式方式适合用来定义只使用一次的函数,声明方式定义的函数没有这个限制,当然也不是绝对的,这个区别只适用于编码规范上;

 2.声明方式定义的函数可以在函数调用之前定义也可以在函数调用之后定义,而表达式方式定义的函数只能在函数调用之前定义;

函数参数

函数参数包括形参,实参,形参就是函数定义时的参数;实参就是函数调用时传入的参数。由于js是弱类型语言,所以js函数的形参不指定类型。

js函数的形参和实参个数可以不一致。形参个数小于实参时,未传的形参值都是undefined,注意形参可以指定默认值,但是只能在函数体内部指定;形参个数小于实参时,在函数体内引用多余实参,必须通过实参对象arguments来获取实参,在函数体内部arguments就是实参对象的引用,并且此时的实参对象是一个数组对象,数组对象每一项对应着函数调用时传入的参数。

PS:实参对象有两个特殊属性callee和caller,其中callee属性代指当前正在执行的函数,caller属性代指调用当前正在执行的函数的函数,caller属性不是标准属性,不是所有浏览器都支持。使用callee属性的典型例子就是匿名函数的递归调用,例如定义一个阶乘函数:

var fact = function(x){  if(x <= 1) {  return 1; }else{  return arguments.callee(x-1)*x; }};

函数作用域

在函数中声明的变量(包括函数形参)在整个函数体内都是可见的,包括嵌套的函数中,在函数外部是不可见的;函数体内部定义的变量会覆盖同名的全局变量;

函数作用域中有个特性很重要,就是“声明提前”,意思就是在函数内部任意位置声明的变量,在函数体内部任意位置都是可见的,这是因为js引擎在预编译js时会把函数中所有的变量声明都提前至函数体顶部。

例如:

var scope = "outter";!function(){ console.log(scope); //undefined var scope = "inner"; console.log(scope); //inner}();console.log(scope);  //outter

说明:

undefined 由于函数作用域的声明提前特性,这里的scope已经在函数顶部声明,但是没有被赋值,所以scope值为undefined

inner scope在函数体内部声明,并且有赋值

outter  函数体内部定义的变量会覆盖同名的全局变量,但是不影响全局变量的值

构造函数

构造函数的用处就是用来初始化新创建的对象,例子:var ary = new Array();

构造函数与普通函数的区别:

 1.函数命名上有区别,构造函数命名时通常是首字符大写,普通函数命名时首字符小写;

 2.调用方式的区别,构造函数是通过new关键字调用,而普通函数直接调用。

立即执行函数

把函数定义和函数执行结合到一起就是立即执行函数,也叫自执行函数。

这里需要注意两点:1.函数定义仅限于表达式方式定义的函数;2.函数执行实际上就是对函数表达式做一次运算,所以一元运算符都可以让函数执行。

这样的话,立即执行函数就会有多种写法:

(function(){console.log("IIFE");}());(function(){console.log("IIFE");})();!function(){console.log("IIFE");}();void function(){console.log("IIFE");}();~function(){console.log("IIFE");}();....

立即执行函数可以接受参数,上面的写法都是可以的,但是编码规范推荐第一种写法,jQuery库使用的就是第一种写法。

那么自执行函数的用处有哪些呢?总结起来常用也就两种:1.保存参数上下文环境;2.作为命名空间。

用处1的适用场景:循环中执行异步函数,并且函数参数随循环变化。

/*** 实例一* 错误写法,因为jQuery的post方法是异步的,循环十次,post方法并行跑十次,* 循环比post方法执行要快,最终传过去的i值都变成了10,即服务端收到index的都是10*/for(var i=0; i<10; i++){ $.post(url,{index:i},function(){});}/*** 正确写法,这样对于循环体中的立即执行函数来说,每次循环得到的参数都不同。立即执行函数* 每执行一次都会创建一个函数上下文环境,在这个上下文环境中的变量值不受外界影响,* 循环十次就会创建十个上下文环境,并且每个上下文环境的i值都不一样。这样的话,* 虽然post方法是异步方法,但是是在每一个上下文环境中执行的,也就是说循环十次,* post方法在十个上下文环境中分别执行了一次,post方法中使用的index参数每次都不一样,* 最终服务端收到的index值就是从0到9十个数值*/for(var i=0; i<10; i++){ (function(index){$.post(url,{index:index},function(){});}(i));}/*** 实例二 * 错误写法,最终会输出十个10,因为循环体的语句会延时执行*/for(var i=0; i<10; i++){ setTimeout(function(){console.log(i);},100);}//正确写法,最终会输出0到9十个数值,原理同上for(var i=0; i<10; i++){ (function(x){setTimeout(function(){console.log(x);},100);}(i));}

用处2的适用场景:你需要写一个公共模块,这个公共模块在很多地方都会使用,但是要保证公共模块中使用的变量和函数不会对其它模块造成污染,这样的话这个公共模块就需要一个单独的不同于其它模块的命名空间。

案例1:创建jQuery插件,保证创建的jQuery插件在jQuery的命名空间内都是有效的,这样每个jQuery对象才可以使用。

(function($){ $.fn.changeStyle = function(colorStr){  this.css("color",colorStr);    return this; }}(jQuery));

案例2:创建一个带有私有变量和私有方法的对象。

var obj = (function(){ var privateAttr,  publicAttr;   function _setPriAttr(){  privateAttr = "private"; }   function getPriAttr(){  return privateAttr; }   return {  attr:publicAttr,     getAttr:function(){   getPriAttr();  } }}());

通过这种方式创建的对象,利用立即执行函数的return语句对外暴露属性以及方法,并且可以保证没有对外暴露对象的属性和方法,在对象外边是无法访问到的。

总结:其实用处1和用处2的原理都是一样的,都是利用了函数作用域的概念,请仔细体会。

参考资料: js权威指南

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!

相关文章

详解web存储中的storage

详解web存储中的storage

详解,电脑软件,web,storage,web存储之storage 近期工作中使用的数据存储比较多,在工作之余写一篇关于存储的博客来加深自己的印象,希望大家多多批评指正。一、 web存储分为两种,sessionStorage、localStorage;二、 web存储的特性;1.设置…

H5上传本地并预览功能

H5上传本地并预览功能

上传,功能,电脑软件,最近工作中需要H5上传显示图片的功能,如图:直接上代码:html部分<div class="works-wrap"> <div class="figure-box" id="figure_box"></div> <div class="add-btn"> <input type="file" id="imgUploadBtn"…

Node.js数据库操作之连接MySQL数据

Node.js数据库操作之连接MySQL数据

数据库操作,数据库,连接,电脑软件,Node,介绍首先说来介绍一下MySQL(非广告)。MySQL是由瑞典的MySQL AB公司开发,后来被甲骨文公司收购。和Oracle一样,MySQL是一个典型的关系型数据库,在百度百科中,把MySQL称为是最好的关系数据库管理系统的之一。…

jquery.uploadifive插件怎么解决上

jquery.uploadifive插件怎么解决上

上传,文件大小,插件,电脑软件,jquery,jQuery.uploadifive插件可以很好的解决上传限制图片或文件大小问题,具体方法如下所示:插件是可以用 但遇到问题如何提示是否超过限制呢没办法研究插件js 发现网上给的提示这个插件里竟然没有没有没有.…

excel表格打印缩小放在一张纸的教

excel表格打印缩小放在一张纸的教

缩小,教程,放在,一张纸,表格,  在Excel中录入的数据过多导致一张纸打印不完,但是放到第二张纸又觉得浪费,这个时候就需要我们进行缩小打印,具体该如何设置缩小打印呢?下面是由小编分享的excel表格打印缩小放在一张纸的教程,以供大家阅读和学…

Excel中2010版进行设置顶端标题行

Excel中2010版进行设置顶端标题行

设置,操作技巧,标题,操作步骤,电脑软件,  在excel录入较多的数据时,我们希望每一页都有标题行,这样就可以清楚的知道我们所要表达的意思了。今天,小编就教大家在Excel中2010版进行设置顶端标题行的操作技巧。Excel中2010版进行设置顶端标题…

jQuery实现table中两列CheckBox只

jQuery实现table中两列CheckBox只

示例,电脑软件,table,jQuery,CheckBox,//html<table id="unit"><tr><th>选项一</th><th>选项二</th><th>姓名</th></tr><tr><td><input type="checkbox" /></td><td><input type="checkbox" /></td><td>小红</td></tr><tr><td><input…

微信小程序本作用域下调用全局JS详

微信小程序本作用域下调用全局JS详

作用域,调用,全局,详解,实例,微信小程序本作用域下调用全局JS详解本地wxml文件<view>app版本:{{version}}</view>本地js文件var app;Page({data:{},onLoad:function() {app = getApp();this.setData({version:app.globalData.appName});}})…

ps怎么设计一个加载的动态小图标?

ps怎么设计一个加载的动态小图标?

加载,小图标,动态,电脑软件,ps,在互联网时代,当网络不好时,看到这样的图片,是不是让你万分抓狂。这里教大家用Photoshop软件制作出动态的加载小图标。软件名称:Adobe Photoshop 8.0 中文完整绿色破解版软件大小:150.1MB更新时间:2015-11-041、 打…

QQ空间相册批量下载的方法QQ空间相

QQ空间相册批量下载的方法QQ空间相

空间,批量下载,方法,电脑软件,QQ,  QQ空间相册里的照片太多了,一张一张下载比较麻烦,怎么批量下载下来呢?下面小编分享QQ空间相册批量下载的方法,需要的朋友可以参考下.QQ空间相册批量下载的方法1、首先下载一个叫做QQ影像的软件。QQ空间相册…

5种JavaScript脚本加载的方式

5种JavaScript脚本加载的方式

脚本,加载,方式,电脑软件,JavaScript,javaScript文件(下面简称脚本文件)需要被HTML文件引用才能在浏览器中运行。在HTML文件中可以通过不同的方式来引用脚本文件,我们需要关注的是,这些方式的具体实现和这些方式可能会带来的性能问题。当浏览器…

BootStrap框架中的data-[ ]自定义

BootStrap框架中的data-[ ]自定义

自定义属性,推荐,框架,电脑软件,BootStrap,最近几天学习bootstrap有感,通过data-api可以使用所有的bootstrap插件,不用写一行js代码,方便了很多,是我们的首选方式。为什么bootstrap的插件当中出现很多data-api,因为我们通常在使用bootstrap框架…