分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 技术分享

js函数

发布时间:2023-09-06 02:11责任编辑:蔡小小关键词:js

函数

Date:2017-07-16 | By Author:Grit

函数定义

var fn = function(){};//函数表达式function fn1(){};//取名函数function (){};//匿名函数fn1();//调用函数

及时函数

//1.国内常用写法(function(){ ???alert();})()//2.国外写法,看起来代码块比较独立(function(){ ???alert();}())//以下方法也可以执行,但是不推荐使用//1!function(){alert()}();//2~function(){alert()}();//3-function(){alert()}();//4+function(){alert()}();

函数特点

  1. 匿名函数不能单独出现,需要给名字
  2. 函数默认返回undefined
  3. 加括号自执行,自己执行的时候 this 执行window对象
  4. 事件驱动函数执行,this指向触发事件的对象
  5. alert弹出函数的时候,弹出则是函数本身代码块

    传参数

//固传参 ???????function fn(a,b){//定义形参 ???????????alert("和为:"+ (a+b) +"\n"+"b的值为:"+b); ???????} ???????fn(30,20);//传入实参//非固定传参 ???????function fn(){//定义函数,先不传入参数 ???????????//arguments为默认参数 ???????????var result = 0; ???????????for(var i=0;i<arguments.length;i++){ ???????????????result = result + arguments[i]*1; ???????????} ???????????return result; ???????} ???????alert(fn(1,2,3,4,5));//调用函数

return返回值
返回函数运行结果,默认函数返回undefined

封装函数

function $(idName) { ???return document.getElementById(idName);}// 严谨一点的写法function $(nodeName) { ???if(nodeName && (typeof nodeName).toLowerCase() === "string") {//判断传入是否为字符串类型 ???????if( document.getElementById(nodeName) ) {//判断是否为空 ???????????return document.getElementById(nodeName); ???????} ???} ???????return "没有获取到元素,请检查传入的是一个正确的字符串id名字";}

函数作用域

// -------------------- 变量作用域 ----------------------------// 首先要了解作用域var a;alert(a);a = 1;/* ???解: ???????第一步:声明,找var和function,除了var和function不是作为开头都为执行操作 ???????第二步:执行。每一个单独的function里面是单独一个作用域 ???定义 var a; ???????执行 alert(a); ????????a = 1;*/// -------------------- 作用域1: ----------------------------/* ???定义:var a; ???执行:a=0; ?????????fn(); ???????????????1)定义:var a; ?fn(){}; ???????????????2)执行:alert(a); // undefined ???????????????????????a = 1; ???var a = 0; ???function fn(){ ???????alert(a); ???}; ???fn(); ???var a = 0; ???function fn(){ ???????alert(a); // a在函数作用域中 ?先找自己的作用域 有没有a ?有 undefined ???????var a = 1; ???}; ???fn(); ???fn(); ?再弹一次 还是undefined ?执行完就 没了*/// -------------------- 作用域2: ----------------------------/* ?作用域链 ?(函数域找不跳到大域) ???定义:var a, fn(){...} ???执行:a = 1 ?????????fn(){...} ???????????????????1) 定义:var b; ???????????????????2) 执行:alert(0); // 0 ????????????????????????????a = 1; ????????????????????????????alert(1); // */var a = 0;function fn(){ ???alert(a); ???a = 1; ???alert(a); ???var b = 2;};fn();// --------------------- 作用域3:------------------------- ???????/* ???1.定义:var a = 666; ?fn(){..}; ???2.执行:fn(); ???????????1) var b; ???????????2) b = 2;*/fn();alert(a); // 666var a = 1;function fn(){ ???a = 666; ???var b = 2;};// ---------------------- 作用域4:-------------------------/* ???1.定义:var a, fn(){} ???2.执行: ???????????fn(){}; ???????????????????1) var a ?b ?c(){}; ???????????????????2) undefined ??????????????????????undefined ??????????????????????整块函数 ???????????alert(a)// undefined*/fn();alert(a); // undefinedvar a = 0;function fn(){ ???alert(a); // undefined ???alert(b); // undefined ???alert(fn); // 一坨 ???var a = 1; ???var b = 2; ???function c(){ ???????alert(a); ???}; ???return c;};

闭包

函数里面的变量是静态的方式存储,创建之后不会被销毁 ———这种特性在计算机科学文献中称为:闭包

作用

js里闭包是为了让外界可以访问到函数内部的值

优点:

  1. 使用私有变量,可以避免命名重复的问题,保护全局作用域污染
  2. 延长变量生命周期,函数使用完成之后内部的变量不会释放,同全局变量一样不会被清理,下次调用函数 继续使用之前"保存"的局部变量

缺点:

  1. 延长变量生命周期,注定就会导致常驻内存得不到及时清理 ==> 滥用闭包则会消耗大量性能
  2. 内存得不到释放,可能会导致内存泄漏甚至浏览器崩溃的情况

    例子

function fn1(){ ???????????var a = 0;//定义变量a ???????????function fn2(){//fn2为闭包函数 ???????????????a++;//访问变量a,并运行自加1 ???????????????alert(a);//弹出上面的a ???????????} ???????????return fn2;//返回fn2函数,这个函数可以访问到上面的变量 ???????} ???????????????var fun=fn1();//定义一个变量,调用fn1(),同时将fn2()传入fun中,可以继续调用 ???????fun();//1 ???????fun();//2

js函数

原文地址:https://www.cnblogs.com/zhuzq/p/9534593.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved