十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
js分为全局作用域和函数作用域,全局作用域在函数内部可以访问到,但是函数内部的变量,外部无法访问到
创新互联公司是一家集网站建设,华宁企业网站建设,华宁品牌网站建设,网站定制,华宁网站建设报价,网络营销,网络优化,华宁网站推广为一体的创新建站企业,帮助传统企业提升企业形象加强企业竞争力。可充分满足这一群体相比中小企业更为丰富、高端、多元的互联网需求。同时我们时刻保持专业、时尚、前沿,时刻以成就客户成长自我,坚持不断学习、思考、沉淀、净化自己,让我们为更多的企业打造出实用型网站。
var name = 'zhangsan';
(function(){
console.log(name)//这里因为变量提升,name === undefined,所以结果是undefined
var name = 'lisi'
console.log(name)//这里执行的是 name = lisi ,所以自然就是lisi了
})()
console.log(name)//函数的作用域,在全局中无法访问,这里结果是张三
var name = 'zhangsan';
(function(){
console.log(name)//函数内部没有name 这个变量,所以像全局查找,全局有一个name,那么结果就是zhangsan
name = 'lisi'
console.log(name)//同理,这里结果是lisi,因为name被赋值成lisi
})()
console.log(name)//lisi
如果一个模块很大,必须分成几个部分,或者一个模块需要继承另一个模块,这时就有必要采用"放大模式"
在浏览器环境中,模块的各个部分通常都是从网上获取的,有时无法知道哪个部分会先加载。如果采用上一节的写法,第一个执行的部分有可能加载一个不存在空对象,这时就要采用"宽放大模式"。
Immediately-Invoked Function Expression(IIFE立即执行函数表达式)
可以让函数在创建后立即执行 必须是一个表达式
1、函数的定义方式一: 函数声明
2、函数的定义方式二: 函数表达式(匿名函数表达式、命名函数表达式)
1、错误写法 直接报错 js引擎看到function关键字会认定后面跟的是函数定义语句,此时后面如果直接加上()会被当做分组操作符,而分组操作符必须有表达式,所以此时报错
2、立即执行函数的正确写法,让js引擎认为这是一个表达式
1、立即执行函数不能再外面再被调用,执行完之后已经被立即销毁了。所以立即执行函数的函数名称可以省略, 统一使用匿名函数表达式
2、由于立即执行函数,执行完后就立即被销毁了 所以它可以创建一个独立的作用域,而且该作用域里面的变量,外面访问不到。因此就可以避免变量污染
正确输出写法:用立即执行函数将i作为参数传入,立即函数每次执行时,会把参数i的值复制一份。然后再创建函数作用域来执行函数
1、立即执行函数和闭包只是有一个共同有点就是都能减少全局变量的使用
2、立即执行函数只是函数的一种调用方式,声明完后立即调用,一般只能调用一次,调用完后会立即被销毁,不会占用内存,有自己的独立作用域,外部不能调用
3、闭包则主要是让外部函数可以访问内部函数的作用域,也减少了全局变量的使用,保证了内部变量的安全,但是被引用的内部变量不会被销毁,增大了内存消耗,使用不当会容易造成内存泄露
可参考:
var init = function() { }; 是函数表达式,函数在代码执行的到当前行的时候才被执行,init 才被赋值。 function init() {} 是函数的声明,和 var 一样,会被提前到代码最前面定义。 所以,下面的两个例子: foo(); // 在函数声明之后调用 foo,...
立即执行函数可以避免函数内的变量暴露在全局环境下,避免全局变量的污染。
这种模式是非常有用的,因为它为你初始化代码提供了一个作用域的沙箱;
考虑一下下面这种常见的场景:
你的代码在页面代码加载完成之后,不得不执行一些设置工作,比如附加时间处理器,创建对象等等,
所有的这些工作只需要执行一次,所以没有理由创建一个可复用的命名的函数,
但这些代码也需要一些临时的变量,但初始化过程结束后,就再也不会被用到了,
所以将这些变量作为全局变量不是个好主意,所以我们需要立即执行函数——去将我们所有的代码包裹在它的局部作用域中,不会让任何变量泄露成全局变量;
你好,我这边测试了一下,两个都是undefine,你的立即执行函数也写错了,应该是(function() {...})(),你最外面的括号写错了位置