1.函数前加叹号的作用
问题:匿名函数直接加括号执行会报错 加括号不报错
(function(){console.log('ok')}())
// ok
(function(){console.log('ok')})()
// ok
加感叹号不报错 返回true是因为匿名函数没有返回值,所以默认返回undefined,取反返回true 原因 无论是加括号还是加感叹号,以及加减乘除运算符,都是让一个函数声明语句变成一个表达式。函数声明语句加括号执行报错,变成表达则不报错。
因为这样的代码混淆了函数声明和函数调用,以这种方式声明的函数
a
,就应该以a();
的方式调用。
但是括号则不同,它将一个函数声明转化成了一个表达式,解析器不再以函数声明的方式处理函数a,而是作为一个函数表达式处理,也因此只有在程序执行到函数a时它才能被访问。
2.匿名函数自调用的原理和作用
(function() { /* code */ })();
可以用它创建命名空间,只要把自己所有的代码都写在这个特殊的函数包装内,那么外部就不能访问,除非你允许(变量前加上window,这样该函数或变量就成为全局)。
3.模块化
模块化发展
1)全局函数,引发命名冲突,数据不安全;
2)namespace 外部可修改,数据不安全;
3)匿名函数自调用 数据私有,接口通过闭包暴露出来 缺点:当模块之间有依赖关系时不好处理。 4)文件模块化
- CommonJS 文件作用域,缓存,同步加载 - 服务端 nodejs
- AMD - 异步加载 - 浏览器
- UMD - 前后端跨平台模块化-兼容以上两种
4.如何设计编写发布一个vue组件
-
设计组件 复用 - 确定属性和API 外到内,确定每个区域的参数 内容 - 元素(属性) 样式 - 插槽/默认模板
-
编写HTML、CSS 布局和样式 属性-> props:{ width:{ type:String, default:0 }... }
-
逻辑代码 :style="imgHeight?{height:imgHeight+'px'}:{}"
-
测试组件
<template v-slot:footer>
<div></div>
</template>
-
打包JS - webpack(模块依赖 -> 静态资源) webpack, 分析文件依赖,把所有相关文件打包成四类文件:js、css、jpg、png entry、output、module(rule、loader(vue-loader))、plugin(HTML)、mode 按需引用-> +index 整体引用
-
打包CSS - gulp 流式的
-
模块化 业务复杂->切分->模块化
-
发布npm - 引入测试