{"id":189,"date":"2019-10-31T17:26:41","date_gmt":"2019-10-31T09:26:41","guid":{"rendered":"http:\/\/blog.adeying.com\/?p=189"},"modified":"2019-10-31T17:26:41","modified_gmt":"2019-10-31T09:26:41","slug":"%e5%89%8d%e7%ab%af%e9%9d%a2%e8%af%95%e6%9c%9f%e5%be%85%e5%8a%a0%e5%85%a5%e4%b8%80%e4%b8%aa%e6%9b%b4%e5%a5%bd%e7%9a%84%e5%9b%a2%e9%98%9f","status":"publish","type":"post","link":"https:\/\/adeqing.com\/index.php\/2019\/10\/31\/default\/189\/","title":{"rendered":"\u524d\u7aef\u9762\u8bd5\u671f\u5f85\u52a0\u5165\u4e00\u4e2a\u66f4\u597d\u7684\u56e2\u961f"},"content":{"rendered":"<div>\n<pre><code class=\"copyable\">1.\u8bf4\u4e00\u4e0b\u4f60\u719f\u6089\u7684\u8bbe\u8ba1\u6a21\u5f0f\r\n2.\u8bf4\u4e00\u4e0b\u4f60\u7406\u89e3\u7684\u6a21\u5757\u673a\u5236\r\n3.MVVM\u539f\u7406\r\n4.\u6700\u719f\u6089\u7684\u6846\u67b6\u8def\u7531\u673a\u5236\r\n5.\u72b6\u6001\u7ba1\u7406\r\n6.\u7edf\u8ba1\u5b57\u7b26\u4e32\u4e2d\u5355\u8bcd\u51fa\u73b0\u6b21\u6570\r\n<span class=\"copy-code-btn\">\u590d\u5236\u4ee3\u7801<\/span><\/code><\/pre>\n<h3 class=\"heading\" data-id=\"heading-1\">1.\u8bf4\u4e00\u4e0b\u4f60\u719f\u6089\u7684\u8bbe\u8ba1\u6a21\u5f0f<\/h3>\n<p>\u6211\u6700\u719f\u6089\u7684\u8bbe\u8ba1\u6a21\u5f0f\uff1a\u5de5\u5382\u6a21\u5f0f\uff08ES5\uff09\uff0c\u7ec4\u4ef6\u8bbe\u8ba1\u6a21\u5f0f\uff08ES6\uff09 \u5de5\u5382\u6a21\u5f0f\uff08ES5\uff0c\u57fa\u4e8eprototype\u3002\u6b64\u4f8b\u4e2d\u57fa\u7c7bBase\uff0c\u5b50\u7c7bFactory)<\/p>\n<pre><code class=\"hljs bash copyable\" lang=\"bash\">var Factory = <span class=\"hljs-function\"><span class=\"hljs-title\">function<\/span><\/span> () {\r\n    <span class=\"hljs-keyword\">if<\/span>(!(this instanceof Factory)){\r\n        <span class=\"hljs-built_in\">return<\/span> new Factory();\r\n    }\r\n}\r\nFactory.prototype = Object.assign(new Base(), {\r\n    version: <span class=\"hljs-string\">'0.0.1'<\/span>,\r\n    defaultOption:{\r\n        title:<span class=\"hljs-string\">'\u6807\u9898'<\/span>\r\n    },\r\n    init:<span class=\"hljs-keyword\">function<\/span> (cfg) {\r\n        this.title = cfg.title || <span class=\"hljs-string\">''<\/span>;\r\n        this.currentOption = Object.assign(this.defaultOption,{\r\n           \/\/...\r\n        })\r\n    },\r\n    render: <span class=\"hljs-function\"><span class=\"hljs-title\">function<\/span><\/span> () {\r\n        var option = this.currentOption;\r\n        this.chart.setOption(option);\r\n    },\r\n    showTitle: <span class=\"hljs-function\"><span class=\"hljs-title\">function<\/span><\/span> () {\r\n        this._showTitle();\r\n    }\r\n})\r\n<span class=\"copy-code-btn\">\u590d\u5236\u4ee3\u7801<\/span><\/code><\/pre>\n<p>\u7ec4\u4ef6\u8bbe\u8ba1\u6a21\u5f0f\uff08ES6\uff0c\u57fa\u4e8eclass\uff0c\u65b9\u4fbf\u7ee7\u627f\u548c\u521d\u59cb\u5316\uff0c\u4e5f\u662fReact\u7ec4\u4ef6\u7684\u63a8\u8350\u5199\u6cd5\uff0c\u6211\u6bd4\u8f83\u559c\u6b22\u3002\u6b64\u4f8b\u4e2d\u7236\u7c7bCompnent\uff0c\u5b50\u7c7bRetrive\uff09<\/p>\n<pre><code class=\"hljs bash copyable\" lang=\"bash\">class Retrive extends Component {\r\n    constructor (props) {\r\n        super(props);\r\n        this.state = {\r\n            name:<span class=\"hljs-string\">''<\/span>\r\n        };\r\n        this.getRemoteData = this.getRemoteData.bind(this);\r\n    }\r\n    getRemoteData (data) {\r\n        this.state.retriveResult = data;\r\n    }\r\n    <span class=\"hljs-function\"><span class=\"hljs-title\">render<\/span><\/span>(){\r\n        <span class=\"hljs-built_in\">return<\/span> (\r\n            &lt;div className=<span class=\"hljs-string\">\"Retrive\"<\/span>&gt;\r\n                &lt;Button name=<span class=\"hljs-string\">\"search\"<\/span> onClick={this.getRemoteData}&gt;\u67e5\u8be2&lt;\/Button&gt;\r\n            &lt;\/div&gt;\r\n        );\r\n    }\r\n}\r\n<span class=\"copy-code-btn\">\u590d\u5236\u4ee3\u7801<\/span><\/code><\/pre>\n<h3 class=\"heading\" data-id=\"heading-2\">2.\u8bf4\u4e00\u4e0b\u4f60\u7406\u89e3\u7684\u6a21\u5757\u673a\u5236<\/h3>\n<p>AMD: \u5f02\u6b65\u6a21\u5757\u52a0\u8f7d\u89c4\u8303\u3002 a.js\uff0c\u5b9a\u4e49\u4e00\u4e2a\u4f9d\u8d56jQuery\u548cechrts\u7684\u7ec4\u4ef6\u3002<\/p>\n<pre><code class=\"hljs bash copyable\" lang=\"bash\">define([<span class=\"hljs-string\">'jquery'<\/span>, <span class=\"hljs-string\">'echarts'<\/span>], <span class=\"hljs-keyword\">function<\/span> ($, echarts) {\r\n  var AMD = <span class=\"hljs-function\"><span class=\"hljs-title\">function<\/span><\/span>(){}\r\n  AMD.prototype = {\r\n       title:<span class=\"hljs-string\">''<\/span>,\r\n        foo: <span class=\"hljs-function\"><span class=\"hljs-title\">function<\/span><\/span>(){}\/\/AMD\u7c7b\u6216\u8005\u7ee7\u627fAMD\u7c7b\u7684\u5b50\u7c7b\u7684\u5c5e\u6027\r\n  }\r\n  <span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-function\"><span class=\"hljs-title\">bar<\/span><\/span>(){}\/\/\u8fd4\u56de\uff0c\u516c\u5171\u5c5e\u6027\r\n   <span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-function\"><span class=\"hljs-title\">baz<\/span><\/span>(){} \/\/\u672a\u8fd4\u56de\uff0c\u79c1\u6709\u5c5e\u6027\r\n  <span class=\"hljs-built_in\">return<\/span> {\r\n       main:AMD,\r\n       bar: bar\r\n  }\r\n});\r\n\r\n<span class=\"copy-code-btn\">\u590d\u5236\u4ee3\u7801<\/span><\/code><\/pre>\n<p>\u5982\u679cb.js\u4f9d\u8d56a.js\uff0c\u53ef\u4ee5\u8fd9\u6837<\/p>\n<pre><code class=\"hljs bash copyable\" lang=\"bash\">define([<span class=\"hljs-string\">'.\/a'<\/span>], <span class=\"hljs-keyword\">function<\/span> (a) {\r\n     \/\/\u8c03\u7528\u6784\u9020\u51fd\u6570,foo\r\n     var instance_amd = new a.main();\r\n     instance_amd.foo()\r\n      \/\/\u8c03\u7528bar\r\n     a.bar()\r\n});\r\n<span class=\"copy-code-btn\">\u590d\u5236\u4ee3\u7801<\/span><\/code><\/pre>\n<p>ES6 modules: \u548cpython\u7684\u5305\u673a\u5236\u5f88\u7c7b\u4f3c\uff0c\u5bfc\u5165import\uff0c\u5bfc\u51faexport\u3002<\/p>\n<pre><code class=\"copyable\">1.\u573a\u666f\uff1avue\uff0creact\u63a8\u8350\u673a\u5236\uff0c\u9700\u8981babel\u8f6c\u4e49\u6210es5\u4ee5\u517c\u5bb9\u6d4f\u89c8\u5668\u3002\r\n2.\u5173\u4e8eimport...(from...)\r\n\u2460.import...from...\u7684from\u547d\u4ee4\u540e\u9762\u53ef\u4ee5\u8ddf\u5f88\u591a\u8def\u5f84\u683c\u5f0f\uff0c\u82e5\u53ea\u7ed9\u51favue\uff0caxios\u8fd9\u6837\u7684\u5305\u540d\uff0c\u5219\u4f1a\u81ea\u52a8\u5230node_modules\u4e2d\u52a0\u8f7d\uff1b\u82e5\u7ed9\u51fa\u76f8\u5bf9\u8def\u5f84\u53ca\u6587\u4ef6\u524d\u7f00\uff0c\u5219\u5230\u6307\u5b9a\u4f4d\u7f6e\u5bfb\u627e\u3002\r\n\u2461.\u53ef\u4ee5\u52a0\u8f7d\u5404\u79cd\u5404\u6837\u7684\u6587\u4ef6\uff1a.js\u3001.vue\u3001.less\u7b49\u7b49\u3002\r\n\u2462.\u53ef\u4ee5\u7701\u7565\u6389from\u76f4\u63a5\u5f15\u5165\u3002\r\n3.\u5173\u4e8eexport\r\n\u2460.\u5bfc\u51fa\u7684\u53ef\u4ee5\u662f\u5bf9\u8c61\uff0c\u8868\u8fbe\u5f0f\uff0c\u51fd\u6570\uff0c\u7c7b\r\n\u2461.\u5bfc\u51fa\u662f\u4e3a\u4e86\u8ba9\u522b\u4eba\u5bfc\u5165\r\n4.\u8a00\u5916\u8bdd:\u4f7f\u7528es6\u7684\u8bdd\uff0c\u6709\u4e00\u4e2a\u7279\u522b\u597d\u7684\u89c4\u8303\u53bb\u9075\u5b88\uff0cairbnb\u7684es6\u89c4\u8303\uff08https:\/\/github.com\/airbnb\/javascript\uff09\r\n<span class=\"copy-code-btn\">\u590d\u5236\u4ee3\u7801<\/span><\/code><\/pre>\n<p>CommonJS\uff1anodejs\u4e2d\u4f7f\u7528\u8f83\u591a\uff0c\u5173\u952e\u8bcd\u662frequire\uff0c\u6ca1\u5199\u8fc7node\u5305\uff0c\u53ea\u5f15\u7528\u8fc7\u522b\u4eba\u7684\u6a21\u5757\uff0c\u6240\u4ee5\u5185\u90e8\u5b9e\u73b0\u539f\u7406\u4e0d\u662f\u5f88\u6e05\u695a\u3002<\/p>\n<h3 class=\"heading\" data-id=\"heading-3\">3.MVVM\u539f\u7406<\/h3>\n<p>MVVM\u662f\u4e00\u79cd\u8f6f\u4ef6\u67b6\u6784\u6a21\u5f0f\uff0cMVVM\u6709\u52a9\u4e8e\u524d\u540e\u7aef\u5206\u79bb\u3002 View:\u89c6\u56fe\u5c42\uff0c\u7c97\u7565\u7406\u89e3\u4e3aDOM\u3002 Model:\u4e0e\u6570\u636e\u5e93\u5bf9\u5e94\u7684model\uff0c\u4e00\u822c\u4e3ajson\u683c\u5f0f\uff0c\u4f5c\u4e3areq\u7684body\u901a\u8fc7http(s)\u4e0e\u6570\u636e\u5e93\u5b9e\u73b0\u901a\u4fe1\u3002 ViewModel:View\u4e0eModel\u901a\u8fc7ViewModel\u5b9e\u73b0\u53cc\u5411\u7ed1\u5b9a\u3002<\/p>\n<p>\u6838\u5fc3\u662f\u63d0\u4f9b\u5bf9View\u548cViewModel\u7684\u53cc\u5411\u6570\u636e\u7ed1\u5b9a\uff0c\u8fd9\u6837\u4f7f\u5f97ViewModel\u7684\u6539\u53d8View\u7acb\u5373\u53d8\u5316\uff0cMVVM\u5728\u524d\u7aef\u7684\u5b9e\u73b0\u6709\uff1aangular\uff0cvue\uff0creact\u3002<\/p>\n<p>vue\u4e2d\u7684\u5e38\u7528\u6570\u636e\u53cc\u5411\u7ed1\u5b9a\u3002<\/p>\n<pre><code class=\"hljs bash copyable\" lang=\"bash\">view:{{message}}\r\nviewModel v-model=<span class=\"hljs-string\">\"message\"<\/span>\r\nmodel:message\r\n<span class=\"copy-code-btn\">\u590d\u5236\u4ee3\u7801<\/span><\/code><\/pre>\n<pre><code class=\"hljs bash copyable\" lang=\"bash\">&lt;div id=<span class=\"hljs-string\">\"app-6\"<\/span>&gt;\r\n  &lt;p&gt;{{ message }}&lt;\/p&gt;\r\n  &lt;input v-model=<span class=\"hljs-string\">\"message\"<\/span>&gt;\r\n&lt;\/div&gt;\r\n\r\nvar app6 = new Vue({\r\n  el: <span class=\"hljs-string\">'#app-6'<\/span>,\r\n  data: {\r\n         message: <span class=\"hljs-string\">'Hello Vue!'<\/span>\r\n  }\r\n})\r\n<span class=\"copy-code-btn\">\u590d\u5236\u4ee3\u7801<\/span><\/code><\/pre>\n<p>\u5355\u6587\u4ef6\u7ec4\u4ef6\u4e2d\u7684\u8bdd\uff0c\u5c31\u591a\u4e86\u4e00\u4e2a\u7528html5\u7684template\u6807\u7b7e\u5c06view\u548cviewModel\u5305\u88f9\u8d77\u6765\uff0cmodel\u90e8\u5206\u505c\u7559\u5728script\u6807\u7b7e\u90e8\u5206\u3002<\/p>\n<pre><code class=\"hljs bash copyable\" lang=\"bash\">&lt;template&gt;\r\n     view\r\n     viewModel\r\n&lt;\/tamplate&gt;\r\n&lt;script&gt;\r\n     model\r\n&lt;\/script&gt;\r\n&lt;styles&gt;\r\n     \u4e3a\u4e86\u8ba9view\u597d\u770b\u70b9\r\n&lt;\/styles&gt;\r\n<span class=\"copy-code-btn\">\u590d\u5236\u4ee3\u7801<\/span><\/code><\/pre>\n<p>react\u7684\u8bdd\uff0c\u6211\u5728\u4f7f\u7528\u7684\u8fc7\u7a0b\u4e2d\uff0c\u6ca1\u6709\u542c\u8bf4\u8fc7\u53cc\u5411\u7ed1\u5b9a\u7684\u4e1c\u897f\uff0c\u5bf9redux reducers\u63a8\u8350\u5199\u4e3a\u7eaf\u51fd\u6570\u5370\u8c61\u6df1\u523b\uff0c\u7eaf\u51fd\u6570\u7684\u8bdd\uff0c\u611f\u89c9\u5e94\u8be5\u6709\u70b9\u5355\u9879\u6570\u636e\u6d41\u7684\u610f\u601d\u3002<\/p>\n<p>\u65e2\u7136\u8bf4\u5230\u6846\u67b6\u4e86\uff0c\u8bf4\u4e00\u4e2a\u6700\u8ba9\u6211\u611f\u89c9\u6709\u8da3\u7684\u70b9\uff0c\u90a3\u5c31\u662f\u7ec4\u4ef6\u95f4\u7684\u901a\u4fe1\uff0c\u5bf9\u4e8e\u7b80\u5355\u7ec4\u4ef6\uff0c\u53ea\u6d89\u53ca\u7236\u5b50\u7ea7\u522b\u7684\u901a\u4fe1\u7684\uff0cvue\u4f7f\u7528on emit\u7684\u65b9\u5f0f\uff0creact\u4f7f\u7528props\u3002\u5bf9\u4e8e\u590d\u6742\u7ea7\u522b\u901a\u4fe1\uff0c\u7237\u7237\u7236\u4eb2\u513f\u5b50\u5b59\u5b50\u7b49\u7b49\u65f6\uff0cvue\u63a8\u8350\u4f7f\u7528vuex\uff0creact\u63a8\u8350\u4f7f\u7528redux\uff0c\u7edf\u4e00\u7684\u5168\u5c40\u72b6\u6001\u6811\u7528\u6765\u505a\u72b6\u6001\u7ba1\u7406\u975e\u5e38\u597d\uff0c\u53ef\u4ee5\u4f7f\u5f97\u903b\u8f91\u975e\u5e38\u6e05\u6670\u3002vue\u9879\u76ee\u6587\u4ef6\u7ed3\u6784\u7814\u7a76\u4e0d\u6df1\uff0creact\u7684\u9879\u76ee\u6587\u4ef6\u7ed3\u6784\u7684\u8bdd\uff0cpresentational\u548ccontainers\u7684\u8bbe\u8ba1\u65b9\u6cd5\u611f\u89c9\u975e\u5e38\u6709\u9053\u7406\uff0c\u4e00\u4e2a\u8d1f\u8d23\u89c6\u56fe\u4e00\u4e2a\u8d1f\u8d23\u6570\u636e\uff0c\u975e\u5e38\u6e05\u723d\u3002<\/p>\n<h3 class=\"heading\" data-id=\"heading-4\">4.\u6700\u719f\u6089\u7684\u6846\u67b6\u8def\u7531\u673a\u5236<\/h3>\n<p>vue\u8def\u7531\u4f9d\u8d56\uff1avue-router \u901a\u8fc7\u7ec4\u5408\u7ec4\u4ef6\u6765\u7ec4\u6210\u5355\u9875\u5e94\u7528\u7a0b\u5e8f\uff0c\u53ea\u9700\u8981\u5c06\u7ec4\u4ef6\u6620\u5c04\u5230\u8def\u7531\u5373\u53ef\u3002 \u524d\u7aef\u8def\u7531\u7684\u6838\u5fc3\uff0c\u5c31\u5728\u4e8e \u2014\u2014 \u6539\u53d8\u89c6\u56fe\u7684\u540c\u65f6\u4e0d\u4f1a\u5411\u540e\u7aef\u53d1\u51fa\u8bf7\u6c42\u3002 \u9700\u8981\u6ce8\u610f2\u79cd\u6a21\u5f0f\u7684\u533a\u522b\uff1ahash\u6a21\u5f0f\u548chistory\u6a21\u5f0f\uff0chash\u6a21\u5f0f\u4f1a\u5728\u540e\u9762\u52a0\u4e00\u4e2a\u5f88\u4e11\u7684#\uff0c\u53ef\u4ee5\u5f00\u542fhistory\u53bb\u6389\u3002 hash\u6a21\u5f0f\u539f\u7406\uff1a\u5b83\u7684\u7279\u70b9\u5728\u4e8e\uff1ahash \u867d\u7136\u51fa\u73b0\u5728 URL \u4e2d\uff0c\u4f46\u4e0d\u4f1a\u88ab\u5305\u62ec\u5728 HTTP \u8bf7\u6c42\u4e2d\uff0c\u5bf9\u540e\u7aef\u5b8c\u5168\u6ca1\u6709\u5f71\u54cd\uff0c\u56e0\u6b64\u6539\u53d8 hash \u4e0d\u4f1a\u91cd\u65b0\u52a0\u8f7d\u9875\u9762\u3002hash\u53ef\u4ee5\u7406\u89e3\u4e3a\u951a\u70b9\uff0c\u4f8b\u5982.\/index.html\/#\/foo\uff0chash\u503c\u4e3a#\/foo\uff0c\u8fd9\u6837\u4e0d\u4f1a\u8df3\u8f6c\u9875\u9762\u3002\u5c31\u76f8\u5f53\u4e8e\u7edf\u4e00\u9875\u9762\u7684\u4e0d\u540c\u951a\u70b9\uff0c\u9875\u9762\u95f4\u8df3\u8f6c\u4e0e .\/index.html\/#foo\u5230.\/index.html\/#bar\u7c7b\u4f3c\u3002<\/p>\n<p>.\/store\/index.js<\/p>\n<pre><code class=\"hljs bash copyable\" lang=\"bash\">import Router from <span class=\"hljs-string\">'vue-router'<\/span>\r\nVue.use(Router)\r\n<span class=\"hljs-built_in\">export<\/span> default new Router({\r\n  routes: [\r\n  {\r\n  path: <span class=\"hljs-string\">'\/common'<\/span>,\r\n  name: <span class=\"hljs-string\">'common'<\/span>,\r\n  component: Common\r\n  }\r\n]\r\n\r\n<span class=\"copy-code-btn\">\u590d\u5236\u4ee3\u7801<\/span><\/code><\/pre>\n<p>\u8def\u7531\u5c42\u9762\u8fd8\u4f1a\u5305\u62ec\u5d4c\u5957\u8def\u7531\uff0c\u52a8\u6001\u8def\u7531\u4ee5\u53ca\u91cd\u5b9a\u5411\uff0c\u76f8\u5f53\u4e8e\u81ea\u5df1\u6a21\u4eff\u6d4f\u89c8\u5668\u8bf7\u6c42\u7136\u540e\u670d\u52a1\u5668\u54cd\u5e94\u6a21\u5f0f\uff0c\u5176\u5b9e\u4e0d\u6d89\u53ca\u5411\u540e\u7aef\u8bf7\u6c42\uff0c\u4ec5\u5728\u6d4f\u89c8\u5668\u5c31\u53ef\u4ee5\u5b9e\u73b0\u9875\u9762\u8df3\u8f6c\uff0c\u524d\u6bb5\u65f6\u95f4\u6211\u505a\u7684\u7528\u6237\u6743\u9650\u63a7\u5236\u5c31\u7528\u5230\u4e86vue-router\uff0c\u76f8\u6bd4MVC\u7ed3\u6784\u4e0b\u7684\u540e\u7aef\u8def\u7531\uff0c\u6e05\u6670\u4e86\u4e0d\u5c11\uff0c\u8fd9\u6837\u540e\u7aef\u53ea\u8981\u8d1f\u8d23\u8def\u7531\u7f16\u5199api\u5c31\u597d\u3002<\/p>\n<h3 class=\"heading\" data-id=\"heading-5\">5.\u72b6\u6001\u7ba1\u7406<\/h3>\n<p>\u4e0b\u9762\u662f\u6211\u5728\u7528vuex\u505a\u9879\u76ee\u65f6\u7684\u4e00\u4e9b\u601d\u8003\uff0c\u7b80\u5355\u4fee\u6539\u4e86\u4e00\u4e0b\uff0c\u4e5f\u6dfb\u52a0\u4e86\u4e00\u4e9b\u5173\u4e8eredux\u7684\u601d\u8003\u3002<\/p>\n<p>vuex state\uff0c\u524d\u7aefdata view\uff0c\u524d\u7aefDOM actions\uff0c\u7528\u6237\u64cd\u4f5c\uff0c\u5f15\u8d77data\u53d8\u5316\u4ece\u800c\u5bfc\u81f4DOM\u53d8\u5316\u3002<\/p>\n<p>\u591a\u4e2a\u7ec4\u4ef6\uff08\u89c6\u56fe\uff09\u5171\u4eab\u72b6\u6001\uff1a\u901a\u4fd7\u6765\u8bb2\uff0c\u5c31\u662f\u591a\u4e2a\u7ec4\u4ef6\u95f4\u4f1a\u901a\u4fe1\u65f6\uff0c\u5bfc\u81f4\u4ece\u540e\u7aef\u62ff\u6765\u7684\u6570\u636e\u53d1\u751f\u53d8\u5316\uff0c\u5f53\u7ec4\u4ef6\u8f83\u591a\u65f6\uff0c\u5982\u679c\u5144\u5f1f\u7ec4\u4ef6\u95f4\u7684\u901a\u4fe1\u90fd\u4f9d\u8d56\u7236\u7ec4\u4ef6\u8fdb\u884c\u901a\u4fe1\uff0c\u4f1a\u5bfc\u81f4\u7ec4\u4ef6\u95f4\u7684\u8026\u5408\u975e\u5e38\u9ad8\uff0c\u4ece\u800c\u5bfc\u81f4\u9879\u76ee\u903b\u8f91\u6df7\u4e71\uff0c\u96be\u4ee5\u7ef4\u62a4\u3002<\/p>\n<p>\u591a\u4e2a\u7ec4\u4ef6\uff08\u89c6\u56fe\uff09\u4f9d\u8d56\u4e8e\u540c\u4e00\u72b6\u6001\u3002 \u6765\u81ea\u4e0d\u540c\u89c6\u56fe\u7684\u884c\u4e3a\u9700\u8981\u53d8\u66f4\u540c\u4e00\u72b6\u6001\u3002<\/p>\n<p>\u5168\u5c40\u5355\u4f8b\u6a21\u5f0f\u7ba1\u7406\uff0c\u628a\u7ec4\u4ef6\u7684\u5171\u4eab\u72b6\u6001\u62bd\u53d6\u51fa\u6765 \u4e0d\u7ba1\u5728\u7ec4\u4ef6\u6811\u7684\u54ea\u4e2a\u4f4d\u7f6e\uff0c\u4efb\u4f55\u7ec4\u4ef6\u90fd\u80fd\u83b7\u53d6\u72b6\u6001\u6216\u8005\u89e6\u53d1\u884c\u4e3a\uff01<\/p>\n<p>\u5b9e\u8df5\u51fa\u771f\u77e5\uff1a<\/p>\n<pre><code class=\"copyable\">1.state\u5b58\u653e\u5728index.js\u4e2d\uff0c\u521b\u5efa\u7684Store\u5b9e\u4f8bgetter,mutations,actions\u7b49\uff0c\u53ef\u4ee5\u5206\u79bb\u51fa\u6765\r\n2.getters\u5b58\u653e\u5728getter.js\u4e2d\uff0c\u6570\u636e\u6d41\u4e3astate\u2192getter\u2192\u7ec4\u4ef6\uff0cgetter\u76f8\u5f53\u4e8e\u4e00\u4e2a\u6570\u636e\u83b7\u53d6\u8fc7\u6ee4\u5668\uff0c\u4ece\u4ed3\u5e93\u62ff\u7279\u5b9a\u6570\u636e\u5230\u7ec4\u4ef6\uff0c\u76f8\u5f53\u4e8e\u5bf9computed\u7684\u96c6\u4e2d\u5904\u7406\u3002\r\n3.mutations\u5b58\u653e\u5728mutations.js\u4e2d\uff0c\u6570\u636e\u6d41\u4e3a\u7ec4\u4ef6\u2192mutations\u2192state\uff0cmutations\u76f8\u5f53\u4e8e\u4e00\u4e2a\u6570\u636e\u63d0\u4ea4\u53d1\u5c04\u5668\uff0c\u4ece\u7ec4\u4ef6\u63d0\u4ea4\u6570\u636e\u5230\u4ed3\u5e93\r\n4.actions\u5b58\u653e\u5728actions.js\u4e2d\uff0c\u6570\u636e\u6d41\u4e3a\u7ec4\u4ef6\u2192actions\u2192mutations\u2192state\uff0c\u5f02\u6b65\u64cd\u4f5c\u7684\u4e3b\u8981\u573a\u6240\u3002\r\n5.modules\u662f\u5f00\u53d1\u5927\u578b\u5e94\u7528\u65f6\u9700\u8981\u7528\u5230\u7684\uff0c\u6bcf\u4e2amodule\u90fd\u6709\u5355\u72ec\u7684states\uff0cgetters\uff0cactions\u4ee5\u53camutation\uff0c\u6709\u4e00\u80a1nodejs\u6a21\u5757\u7684\u5473\u9053\u3002\r\n<span class=\"copy-code-btn\">\u590d\u5236\u4ee3\u7801<\/span><\/code><\/pre>\n<p>vuex\u4e09\u539f\u5219\uff1a<\/p>\n<pre><code class=\"copyable\">1.\u552f\u4e00\u6570\u636e\u6e90\r\n2.\u4fdd\u6301\u72b6\u6001\u53ea\u8bfb\r\n3.\u6570\u636e\u6539\u53d8\u53ea\u80fd\u901a\u8fc7\u7eaf\u51fd\u6570\u5b8c\u6210 \u66f4\u6539 Vuex \u7684 store \u4e2d\u7684\u72b6\u6001\u7684\u552f\u4e00\u65b9\u6cd5\u662f\u63d0\u4ea4 mutation\u3002\r\n<span class=\"copy-code-btn\">\u590d\u5236\u4ee3\u7801<\/span><\/code><\/pre>\n<p>\u4e00\u5b9a\u8981\u6ce8\u610fmutation\u548caction\u7684\u533a\u522b\uff01<\/p>\n<p>mutation\u53ea\u53d8\u66f4\u672c\u5730\u7684\u72b6\u6001\uff0c\u4e5f\u5c31\u662f\u8bf4\uff0c\u76f4\u63a5\u53ea\u53bb\u4fee\u6539store\u4e2d\u7684\u6570\u636e\u3002 action\u5305\u542b\u5f02\u6b65\u64cd\u4f5c\uff0c\u76f4\u63a5\u8c03\u7528api\uff0c\u901a\u8fc7api\u7684\u6570\u636e\uff0c\u518d\u63d0\u4ea4mutation\u3002<\/p>\n<p>\u53ef\u4ee5\u8bf4\uff0caction\u53ea\u6bd4mutation\u591a\u4e86\u4e00\u4e2a\u5f02\u6b65\u8c03\u7528api\u7684\u64cd\u4f5c\uff0c\u56e0\u4e3a\u8c03\u7528api\u540e\uff0c\u4e00\u822c\u67092\u79cd\u8fd4\u56de\u7ed3\u679c\uff0csucces\u6216\u8005error\uff0c\u6216\u8005\u662fpromise\u7684\u591a\u79cd\u72b6\u6001\uff0c\u6839\u636e\u4e0d\u540c\u7684\u3002<\/p>\n<p>\u6700\u8fd1\u5728\u5b66\u4e60redux\uff0c\u7ec4\u4ef6dispatch\u4e00\u4e2aaction\u5230store\uff0c\u76f8\u5f53\u4e8e\u53d1\u9001\u4e00\u4e2ahttp\u8bf7\u6c42\uff0c\u7136\u540estore\u505a\u51fa\u54cd\u5e94\uff0c\u8fd4\u56de\u4e00\u4e2aresponse\u7ed9\u7ec4\u4ef6\u3002\u548cvuex\u5927\u81f4\u7c7b\u4f3c\uff0c\u552f\u4e00\u6709\u533a\u522b\u7684\u662f\uff0cvuex\u8fd8\u9700\u8981\u5f15\u5165react-redux\uff0c\u5f15\u5165Provider\u548cconnect\u8fde\u63a5\u7ec4\u4ef6\u548cstore\u3002<\/p>\n<h3 class=\"heading\" data-id=\"heading-6\">6.\u7edf\u8ba1\u5b57\u7b26\u4e32\u4e2d\u5355\u8bcd\u51fa\u73b0\u6b21\u6570<\/h3>\n<p>&#8221; hi how are you i am fine thank you youtube am am &#8220;\uff0c\u7edf\u8ba1&#8221;you&#8221;\u51fa\u73b0\u7684\u6b21\u6570\u3002<\/p>\n<pre><code class=\"hljs bash copyable\" lang=\"bash\"><span class=\"hljs-keyword\">function<\/span> wordCount(str,word){\r\n  var str = str || <span class=\"hljs-string\">\"\"<\/span>;\r\n  var word = word || <span class=\"hljs-string\">\"\"<\/span>;\r\n  var strArr = str.split(<span class=\"hljs-string\">\" \"<\/span>);\r\n  var count = 0;\r\n  <span class=\"hljs-keyword\">for<\/span>(var i=0;i&lt;strArr.length;i++){\r\n      <span class=\"hljs-keyword\">if<\/span>(word===strArr[i]){\r\n          count++\r\n      }\r\n  }\r\n  <span class=\"hljs-built_in\">return<\/span> count;\r\n}\r\nwordCount(<span class=\"hljs-string\">\"hi how are you i am fine thank you youtube am am\"<\/span>,<span class=\"hljs-string\">\"you\"<\/span>);\r\n<span class=\"copy-code-btn\">\u590d\u5236\u4ee3\u7801<\/span><\/code><\/pre>\n<p>\u5982\u679c\u5b57\u7b26\u4e32\u6ca1\u6709\u7a7a\u683c\u600e\u4e48\u529e\uff1f<\/p>\n<pre><code class=\"hljs bash copyable\" lang=\"bash\"><span class=\"hljs-keyword\">function<\/span> wordCount(str,word){\r\n  var str = str || <span class=\"hljs-string\">\"\"<\/span>;\r\n  var word = word || <span class=\"hljs-string\">\"\"<\/span>;\r\n  var count = 0;\r\n  var index = str.indexOf(word);\r\n  <span class=\"hljs-keyword\">while<\/span>(index!==-1){\r\n      count++;\r\n      str = str.substr(index+word.length);\r\n      index = str.indexOf(word)\r\n  }\r\n  <span class=\"hljs-built_in\">return<\/span> count;\r\n}\r\nwordCount(<span class=\"hljs-string\">\"hihowareyouiamfinethankyouyoutubeamam\"<\/span>,<span class=\"hljs-string\">\"you\"<\/span>);\r\n<span class=\"copy-code-btn\">\u590d\u5236\u4ee3\u7801<\/span><\/code><\/pre>\n<p>\u5982\u679c\u4e0d\u7528js\u5185\u7f6e\u5b57\u7b26\u4e32\u51fd\u6570\uff0c\u81ea\u5df1\u7528\u6bcf\u4e2a\u5b57\u7b26\u5bf9\u6bd4\u5462\uff1f<\/p>\n<pre><code class=\"hljs bash copyable\" lang=\"bash\"><span class=\"hljs-keyword\">function<\/span> wordCount(str,word){\r\n  var num = 0;\r\n  var str = str+<span class=\"hljs-string\">\"  \"<\/span> || <span class=\"hljs-string\">\"\"<\/span>;\r\n  var word = word || <span class=\"hljs-string\">\"\"<\/span>;\r\n  var strArr = str.split(<span class=\"hljs-string\">\"\"<\/span>);\r\n  var wordArr = word.split(<span class=\"hljs-string\">\"\"<\/span>);\r\n  var count = 0;\r\n  <span class=\"hljs-keyword\">function<\/span> compare(arr1,a,arr2,b){\r\n        <span class=\"hljs-keyword\">if<\/span>(b+a&lt;arr2.length){\r\n          <span class=\"hljs-keyword\">if<\/span>(arr1[a]===arr2[b+a]){\r\n            num++;\r\n            <span class=\"hljs-built_in\">return<\/span> compare(arr1,a+1,arr2,b+1)\r\n          }\r\n          <span class=\"hljs-keyword\">if<\/span>(num===arr1.length){\r\n            count++\r\n            num = 0;\r\n          }\r\n        }\r\n  }\r\n  <span class=\"hljs-keyword\">for<\/span>(var i=0;i&lt;strArr.length;i++){\r\n      <span class=\"hljs-keyword\">for<\/span>(var j=0;j&lt;wordArr.length;j++){\r\n        <span class=\"hljs-keyword\">if<\/span>(wordArr[wordArr.length-1]===strArr[i+wordArr.length-1]){\r\n          compare(wordArr,0,strArr,i+0)\r\n        }\r\n      }\r\n  }\r\n  <span class=\"hljs-built_in\">return<\/span> count;\r\n}\r\nwordCount(<span class=\"hljs-string\">\"hihowareyouiamfinethankyouyoutubeamam\"<\/span>,<span class=\"hljs-string\">\"am\"<\/span>);\r\n<span class=\"copy-code-btn\">\u590d\u5236\u4ee3\u7801<\/span><\/code><\/pre>\n<p>\u53ef\u4ee5\u66f4\u52a0\u9ad8\u6548\u4e00\u4e9b\u5417\uff1f<\/p>\n<pre><code class=\"hljs bash copyable\" lang=\"bash\"><span class=\"hljs-keyword\">function<\/span> wordCount (str,word) {\r\n\r\n  var str = str+<span class=\"hljs-string\">\"  \"<\/span> || <span class=\"hljs-string\">\"\"<\/span>;\r\n  var word = word || <span class=\"hljs-string\">\"\"<\/span>;\r\n  var strArr = str.split(<span class=\"hljs-string\">\"\"<\/span>);\r\n  var wordArr = word.split(<span class=\"hljs-string\">\"\"<\/span>);\r\n  var wordArrLen = wordArr.length;\r\n  var count = 0;\r\n  var num = 0;\r\n\r\n  <span class=\"hljs-keyword\">function<\/span> compare (arr1,a,arr2,b) {\r\n        <span class=\"hljs-keyword\">if<\/span>(b+a&lt;arr2.length){\r\n          <span class=\"hljs-keyword\">if<\/span>(arr1[a]===arr2[b+a]){\r\n            num++;\r\n            <span class=\"hljs-built_in\">return<\/span> compare(arr1,a+1,arr2,b+1)\r\n          }\r\n          <span class=\"hljs-keyword\">if<\/span>(num===arr1.length){\r\n            count++;\r\n            num = 0;\r\n          }\r\n        }\r\n  }\r\n\r\n  var j = 0;\r\n  <span class=\"hljs-keyword\">while<\/span>(j&lt;wordArrLen){\r\n      var i = 0;\r\n      <span class=\"hljs-keyword\">while<\/span>(i&lt;strArr.length){\r\n          <span class=\"hljs-keyword\">if<\/span>(wordArr[wordArrLen -1]===strArr[i+wordArrLen -1]){\r\n            compare(wordArr,0,strArr,i+0);\r\n          }\r\n          i++;\r\n      }\r\n      j++;\r\n  }\r\n  <span class=\"hljs-built_in\">return<\/span> count;\r\n}\r\n\r\nwordCount(<span class=\"hljs-string\">\"hihowareyouiamfinethankyouyoutubeamam\"<\/span>,<span class=\"hljs-string\">\"a\"<\/span>);\r\n\r\n\/\/1.\u8c03\u6574\u6700\u9ad8\u5c42\u7ea7\u904d\u5386\u6570\u7ec4\uff0c\u4ece37\u76842\u6b21\u65b9\u964d\u52303\u76842\u6b21\u65b9\uff0c\u4ece1369\u964d\u52309\r\n\/\/2.\u5408\u5e76\u63a7\u5236\u53d8\u91cf\u548c\u63a7\u5236\u6761\u4ef6\uff0c\u4f7f\u7528<span class=\"hljs-keyword\">while<\/span>\u66ff\u4ee3<span class=\"hljs-keyword\">for<\/span>\uff0c\u53bb\u9664JS\u5f15\u64ce\u67e5\u8be2i,j\u662f\u5426\u5b58\u5728\u7684\u6d88\u8017\uff0c\u4f1a\u7a0d\u5fae\u964d\u4f4e\u4ee3\u7801\u53ef\u8bfb\u6027\r\n\/\/3.\u5bf9\u91cd\u590d\u5f15\u7528\u7684wordArr.length,\u8d4b\u503c\u7ed9\u5c40\u90e8\u53d8\u91cfwordArrLen,\u5728\u8fd9\u91cc\uff0cArray.prototype.length\u7684\u67e5\u8be2\u6b21\u6570\u4ece3\u6b21\u964d\u4f4e\u52301\u6b21\r\n<span class=\"copy-code-btn\">\u590d\u5236\u4ee3\u7801<\/span><\/code><\/pre>\n<h2 class=\"heading\" data-id=\"heading-7\">\u9762\u8bd52 -\u83ab\u6101\u524d\u8def\u65e0\u77e5\u5df1\uff0c\u5929\u4e0b\u8c01\u4eba\u4e0d\u8bc6\u541b<\/h2>\n<pre><code class=\"copyable\">1.\u5e73\u65f6\u6709\u9047\u5230\u8fc7\u8de8\u57df\u95ee\u9898\u5417\uff1f\r\n2.\u4e0b\u9762\u8fd9\u6bb5\u4ee3\u7801\u6700\u7ec8\u8f93\u51fa\u4ec0\u4e48\uff1f\r\n3.[\"1\",\"2\",\"3\"].map(parseInt)\u8fd4\u56de\u7684\u662f\u4ec0\u4e48\uff1f\r\n4.\u4e0b\u9762\u4ee3\u7801\u4e2d\u201c\u5165\u5e93\u201d\u7684\u989c\u8272\u662f\uff1f\r\n<span class=\"copy-code-btn\">\u590d\u5236\u4ee3\u7801<\/span><\/code><\/pre>\n<h3 class=\"heading\" data-id=\"heading-8\">1.\u5e73\u65f6\u6709\u9047\u5230\u8fc7\u8de8\u57df\u95ee\u9898\u5417\uff1f<\/h3>\n<p>\u8bf4\u5230\u8de8\u57df\u95ee\u9898\uff0c\u5c31\u4e00\u5b9a\u8981\u8bf4\u5230\u540c\u6e90\uff0c\u4ec0\u4e48\u662f\u540c\u6e90\uff0c\u76f8\u540c\u534f\u8bae\uff0c\u76f8\u540c\u57df\u540d\uff0c\u76f8\u540c\u7aef\u53e3\uff0c\u5373\u4e3a\u540c\u6e90\u3002<\/p>\n<p>\u4e0d\u540c\u6e90\u4e4b\u95f4\u7684\u901a\u4fe1\u5c31\u4f1a\u6709\u8de8\u57df\u95ee\u9898\uff0c\u4e00\u822c\u6765\u8bf4\u662f\u5ba2\u6237\u7aef\u8bbf\u95ee\u670d\u52a1\u5668\uff0c\u670d\u52a1\u5668\u4e0a\u53bb\u914d\u7f6e\u8de8\u57df\u3002 \u6211\u9047\u5230\u7684\u8de8\u57df\u95ee\u9898\u90fd\u662f\u540e\u7aef\u53bb\u914d\u7f6e\u4e00\u4e0b\u5c31\u53ef\u4ee5\u89e3\u51b3\u7684\uff0c\u6bd4\u5982\u6211\u524d\u7aef\u5728\u7528vue\u7684\u5b98\u65b9\u63a8\u8350\u5f02\u6b65\u8bf7\u6c42\u5e93axios\uff0c\u53bb\u8bf7\u6c42\u540e\u7aef\u7684koa\u5f00\u542f\u7684\u540e\u7aef\u670d\u52a1\u65f6\uff0c\u5c31\u4f1a\u9047\u5230\u8de8\u57df\u7684\u95ee\u9898\uff0c\u4f8b\u5982koa\u4f7f\u7528\u4f9d\u8d56koa-cors\u5c31\u53ef\u4ee5\uff0c\u5177\u4f53\u7684\u8bdd\uff0c\u5c31\u662fAccess-Control-Allow-Origin: \u6e90\u540d\uff0c\u53ef\u4ee5\u4e3a*\u6216\u8005\u662f\u7279\u6b8a\u7684\u6e90\u3002\u6216\u8005\u662f\u4f20\u7edf\u7684maven\u6216\u8005nginx\u4e0a\uff0c\u4e5f\u53ef\u4ee5\u5f88\u65b9\u4fbf\u7684\u914d\u7f6e\u8de8\u57df\u3002<\/p>\n<p>JSONP\u6709\u7528\u8fc7\u5417\uff1fJSONP\u6ca1\u7528\u8fc7\uff0c\u4f46\u662f\u539f\u7406\u8c8c\u4f3c\u662f\u901a\u8fc7js\u52a0\u8f7d\u4e00\u4e2ascript DOM\u6807\u7b7e\u8fdb\u6765\uff0c\u7136\u540e\u5728\u65b0\u7684script\u7684src\u4e2d\u5f15\u5165\u60f3\u8981\u6267\u884c\u7684\u4ee3\u7801\u3002 \u5176\u5b9e\u8de8\u57df\u95ee\u9898\u5728\u540e\u7aef\u4e2d\u4e5f\u6709\u7c7b\u4f3c\u7684\uff0c\u53ea\u4e0d\u8fc7\u662f\u53eb\u505a\u8fdb\u7a0b\u95f4\u901a\u4fe1\uff0c\u6709IPC\uff0cRPC\u7b49\u7b49\u65b9\u5f0f\u8fdb\u884c\u8fdb\u7a0b\u95f4\u901a\u4fe1\u3002<\/p>\n<h3 class=\"heading\" data-id=\"heading-9\">2.\u4e0b\u9762\u8fd9\u6bb5\u4ee3\u7801\u6700\u7ec8\u8f93\u51fa\u4ec0\u4e48\uff1f<\/h3>\n<pre><code class=\"hljs bash copyable\" lang=\"bash\"><span class=\"hljs-built_in\">let<\/span> O = <span class=\"hljs-keyword\">function<\/span>(name){\r\n\u00a0this.name = name || <span class=\"hljs-string\">'world'<\/span>;\r\n};\r\nO.prototype.hello = <span class=\"hljs-function\"><span class=\"hljs-title\">function<\/span><\/span>(){\r\n\u00a0<span class=\"hljs-built_in\">return<\/span> <span class=\"hljs-function\"><span class=\"hljs-title\">function<\/span><\/span>(){\r\n\u00a0 console.log(<span class=\"hljs-string\">'hello '<\/span> + this.name);\r\n\u00a0};\r\n};\r\n<span class=\"hljs-built_in\">let<\/span> o = new O;\r\n<span class=\"hljs-built_in\">let<\/span> hello = o.hello();\r\nhello();\r\n<span class=\"copy-code-btn\">\u590d\u5236\u4ee3\u7801<\/span><\/code><\/pre>\n<p>\u5e74\u8f7b\u7684\u6211\u7684\u7b54\u6848\u662f\uff1ahello world\u3002<\/p>\n<p>\u7b54\u6848\u663e\u7136\u662f\u4e0d\u5bf9\u7684\uff0c\u56e0\u4e3a\u8fd9\u662f\u4e00\u9053\u9677\u9631\u9898\uff0c\u9677\u9631\u5c31\u5728\u4e8eO.prototype.hello\u8c03\u7528\u540e\uff0creturn\u7684\u662f\u4e00\u4e2a\u51fd\u6570\uff0c\u8fd9\u4e48\u505a\u7684\u8bdd\uff0c\u5728\u6267\u884c\u65b0\u5b9e\u4f8bo\u7684hello\u65b9\u6cd5\u662f\uff0cthis\u5176\u5b9e\u5df2\u7ecf\u53d8\u6210\u4e86window\u3002<\/p>\n<p>\u90a3\u4e48\u7b54\u6848\u662fhello undefined\u5417\uff1f<\/p>\n<p>\u5e74\u8f7b\u7684\u4f60\u53c8\u9519\u4e86\uff0c\u5e76\u4e0d\u662f\u3002<\/p>\n<p>\u800c\u662f hello \u3002<\/p>\n<p>\u8bf7\u6ce8\u610f\uff0c\u662fhello \uff0c\u800c\u4e0d\u662fhello undefined\uff0c\u800c\u662f\u7a7a\u5b57\u7b26\u4e32<\/p>\n<p>\u539f\u56e0\u5c31\u5728\u4e8ewindow.name\u662f\u4e8b\u5148\u662f\u6709\u5b9a\u4e49\u7684\uff0c\u800c\u4e14\u5176\u503c\u4e3a\u7a7a\u3002<\/p>\n<p>\u4e0d\u4fe1\u7684\u8bdd\u4f60\u53ef\u4ee5\u5728\u63a7\u5236\u53f0\u6253\u5370window.name\uff0c\u8fd4\u56de\u7684\u662f&#8221;&#8221;\uff0c\u4f60\u518d\u6253\u5370window.yourname\u8bd5\u8bd5\u770b\uff0c\u6bd4\u5982window.frank\uff0c\u8fd4\u56de\u7684\u5c31\u662fundefined\u4e86\u3002<\/p>\n<p>\u611f\u8c22@ygh1\u7684\u63d0\u9192\uff0c\u6253\u5370\u7ed3\u679c\u548c\u8fd0\u884c\u73af\u5883\u4e5f\u662f\u6709\u5173\u7684\uff0c\u56e0\u4e3anode\u4e2d\u5168\u5c40\u662fglobal\uff0cbrowser\u4e2d\u5168\u5c40\u662fwindow\u3002<\/p>\n<p>\u521a\u5728node\u91cc\u8dd1\u4e86\u4e0b\u6709\u9677\u9631\u7684\u9898\u76ee\uff0c\u6253\u5370\u51fa\u6765\u786e\u5b9e\u662fhello undefined\uff0c\u56e0\u4e3anode\u4e2d\u7684global\u5bf9\u8c61\u6ca1\u6709\u521d\u59cb\u7684name\u5c5e\u6027\u3002<\/p>\n<p>\u6240\u4ee5\u6700\u6b63\u786e\u7684\u7b54\u6848\u5e94\u8be5\u662f\uff1a<\/p>\n<pre><code class=\"hljs bash copyable\" lang=\"bash\">node\u73af\u5883\uff1ahello undefined\r\nbrowser\u73af\u5883\uff1ahello _____(\u975e\u96f6\u5bbd\u7a7a\u5b57\u7b26)\r\n<span class=\"copy-code-btn\">\u590d\u5236\u4ee3\u7801<\/span><\/code><\/pre>\n<p>\u800c\u6211\u5728\u5de5\u4f5c\u4e2d\uff0c\u9047\u5230\u7684\u66f4\u591a\u7684\u5e38\u89c1\u7684\u50cf\u4e0a\u9762\u4e00\u6837\u7684\u5de5\u5382\u51fd\u6570\u5f0f\u7684\u5199\u6cd5\u662f\u8fd9\u6837\u7684\u3002<\/p>\n<pre><code class=\"hljs bash copyable\" lang=\"bash\"><span class=\"hljs-built_in\">let<\/span> O = <span class=\"hljs-keyword\">function<\/span>(name){\r\n\u00a0this.name = name || <span class=\"hljs-string\">'world'<\/span>;\r\n};\r\nO.prototype.hello = <span class=\"hljs-function\"><span class=\"hljs-title\">function<\/span><\/span>(){\r\n\u00a0 console.log(<span class=\"hljs-string\">'hello '<\/span> + this.name);\r\n};\r\n<span class=\"hljs-built_in\">let<\/span> o = new O(<span class=\"hljs-string\">\"frank\"<\/span>);\r\n<span class=\"hljs-built_in\">let<\/span> hello = o.hello(<span class=\"hljs-string\">\"frank\"<\/span>);\r\n<span class=\"copy-code-btn\">\u590d\u5236\u4ee3\u7801<\/span><\/code><\/pre>\n<p>\u6253\u5370\u7ed3\u679c\u4e3a\uff1ahello frank\u3002<\/p>\n<p>\u5982\u679c\u4e0d\u4f20\u5165frank\u7684\u8bdd\uff0c\u6253\u5370\u51fa\u7684\u662f\u9ed8\u8ba4\u503chello world\u3002<\/p>\n<h3 class=\"heading\" data-id=\"heading-10\">3.[&#8220;1&#8243;,&#8221;2&#8243;,&#8221;3&#8221;].map(parseInt)\u8fd4\u56de\u7684\u662f\u4ec0\u4e48\uff1f<\/h3>\n<p>A. [1,2,3] B.[&#8220;1&#8243;,&#8221;2&#8243;,&#8221;3&#8221;] C.[1,1,1] D.\u5176\u4ed6<\/p>\n<p>\u8fd9\u7279\u4e48\u53c8\u662f\u4e00\u9053\u9677\u9631\u9898\uff0c\u8fd8\u597d\u6211\u4e4b\u524d\u5728\u770bMDN\u7684map\u51fd\u6570\u65f6\uff0c\u770b\u5230\u8fc7\u8fd9\u4e2a\u9677\u9631\u3002<\/p>\n<p>\u6b63\u786e\u7b54\u6848\u662fD\uff1a\u5176\u4ed6\u3002<\/p>\n<p>\u5176\u4ed6\u7684\u5177\u4f53\u503c\u4e3a\u591a\u5c11\uff1f[1,NaN,NaN]\u3002<\/p>\n<p>\u4e0d\u6562\u76f8\u4fe1\u5427\uff0c\u4e3a\u4ec0\u4e48\u4e0d\u662f\u53ef\u7231\u7684[1,2,3]\u5462\uff1f<\/p>\n<p>\u56e0\u4e3amap\u7684callback\u67093\u4e2a\u53c2\u6570\uff0ccurrentValue\uff0cindex\u548carray\uff0cparseInt\u67092\u4e2a\u53c2\u6570\uff0cstring\u548cradix\uff08\u8fdb\u5236\uff09\uff0c\u53ea\u4f20\u5165parseInt\u5230map\u4e2d\u7684\u8bdd\uff0c\u4f1a\u81ea\u52a8\u5ffd\u7565\u7b2c\u4e09\u4e2a\u53c2\u6570array\uff0c\u4f46\u662f\u4e0d\u4f1a\u5ffd\u7565index\uff0c\u6240\u4ee5\u5c31\u4f1a\u628a0,1,2\u4f5c\u4e3a\u7b2c\u4e8c\u4e2a\u53c2\u6570\u4f20\u7ed9parseInt\u3002<\/p>\n<p>\u5982\u679c\u8fd8\u4e0d\u660e\u767d\u7684\u8bdd\uff0c\u6211\u4eec\u628a[&#8220;1&#8243;,&#8221;2&#8243;,&#8221;3&#8221;].map(parseInt)\u7684\u6bcf\u4e00\u6b65\u90fd\u62c6\u5f00\u6765\u3002<\/p>\n<pre><code class=\"hljs bash copyable\" lang=\"bash\">parseInt(<span class=\"hljs-string\">\"1\"<\/span>,0) \u6b64\u65f6\u5c06\u5b57\u7b26<span class=\"hljs-string\">\"1\"<\/span>\u8f6c\u6362\u4e3aO\u8fdb\u5236\u6570\uff0c\u7531\u4e8e0\u8fdb\u5236\u6570\u4e0d\u5b58\u5728\uff0c\u6240\u4ee5\u8fd4\u56deNumber\u7c7b\u578b\u76841\u3002\r\nparseInt(<span class=\"hljs-string\">\"2\"<\/span>,1) \u6b64\u65f6\u5c06\u5b57\u7b26<span class=\"hljs-string\">\"2\"<\/span>\u8f6c\u6362\u4e3a1\u8fdb\u5236\u6570\uff0c\u7531\u4e8e\u8d85\u51fa\u8fdb\u5236\u65701\uff0c\u6240\u4ee5\u8fd4\u56deNaN\u3002\r\nparseInt(<span class=\"hljs-string\">\"3\"<\/span>,2) \u6b64\u65f6\u5c06\u5b57\u7b26<span class=\"hljs-string\">\"3\"<\/span>\u8f6c\u6362\u4e3a2\u8fdb\u5236\u6570\uff0c\u7531\u4e8e\u8d85\u51fa\u8fdb\u5236\u65702\uff0c\u6240\u4ee5\u8fd4\u56deNaN\u3002\r\n<span class=\"copy-code-btn\">\u590d\u5236\u4ee3\u7801<\/span><\/code><\/pre>\n<p>\u81f3\u6b64\uff0c\u771f\u76f8\u5927\u767d\u3002 \u90a3\u4e48\u5e38\u7528\u7684\u975e\u9677\u9631\u5f0fmap\u5199\u6cd5\u662f\u600e\u6837\u7684\u5462\uff1f<\/p>\n<p>\u50cf\u8fd9\u6837\uff1a<code>[\"1\",\"2\",\"3\"].map(x=&gt;parseInt(x))<\/code><\/p>\n<p>\u4f20\u4e00\u4e2a\u5b8c\u6574\u7684\u51fd\u6570\u8fdb\u53bb\uff0c\u6709\u5f62\u53c2\uff0c\u6709callback\uff0c\u8fd9\u6837\u5c31\u4e0d\u4f1a\u9020\u6210\u56e0\u4e3a\u53c2\u6570\u4f20\u5165\u9519\u8bef\u800c\u9020\u6210\u7ed3\u679c\u9519\u8bef\u4e86\uff0c\u6700\u540e\u8fd4\u56de\u4e00\u4e2a\u6f02\u6f02\u4eae\u4eae\u7684\u7ecf\u7531\u7eaf\u51fd\u6570\u5904\u7406\u540e\u7684\u65b0\u6570\u7ec4\u56de\u6765\u3002<\/p>\n<p>\u5176\u5b9e\u8fd9\u91cc\u5982\u679c\u518d\u6df1\u5165\u7684\u8bdd\uff0c\u53ef\u4ee5\u518d\u8003\u5bdf\u7eaf\u51fd\u6570\u662f\u4ec0\u4e48\uff1f<\/p>\n<p>\u7eaf\u51fd\u6570\u5176\u5b9e\u5c31\u662f\u4e00\u4e2a\u4e0d\u6539\u53d8\u8f93\u5165\uff0c\u4f46\u662f\u53ef\u4ee5\u501f\u52a9\u8f93\u5165\uff0c\u4ea7\u751f\u4e00\u4e2a\u4ee5\u8f93\u5165\u4e3a\u539f\u6750\u6599\uff0c\u7ecf\u8fc7\u52a0\u5de5\u5904\u7406\u540e\uff0c\u8f93\u51fa\u4e00\u4e2a\u5168\u65b0\u7684\u8f93\u51fa\u7684\u51fd\u6570\uff0c\u5173\u952e\u5728\u4e8e\u4e0d\u6539\u53d8\u8f93\u5165\uff0c\u7eaf\u51fd\u6570\u662f\u7f16\u5199redux\u7684reducer\u5fc5\u987b\u5177\u5907\u7684\u6280\u80fd\u70b9\u3002<\/p>\n<p>\u521a\u624d\u516c\u53f8\u7684\u5927\u725b\u8fc7\u6765\uff0c\u8bf4\u4ed6\u4ece\u6765\u4e0d\u7528parseInt\uff0c\u4ed6\u7528\u52a0\u53f7\uff0c+&#8221;1&#8243; \u8fd4\u56de1\uff0c+&#8221;2&#8243;\u8fd4\u56de2\u3002\u5927\u725b\u679c\u7136\u5927\u725b\uff0c\u9ed1\u79d1\u6280\u662f\u771f\u7684\u591a\u3002<\/p>\n<h3 class=\"heading\" data-id=\"heading-11\">4.\u4e0b\u9762\u4ee3\u7801\u4e2d\u201c\u5165\u5e93\u201d\u7684\u989c\u8272\u662f\uff1f<\/h3>\n<pre><code class=\"hljs bash copyable\" lang=\"bash\">&lt;ul class=<span class=\"hljs-string\">\"list\"<\/span> id=<span class=\"hljs-string\">\"list\"<\/span>&gt;\r\n\u00a0&lt;li class=<span class=\"hljs-string\">\"favorite\"<\/span>&gt;\r\n\u00a0 &lt;span&gt;\u51fa\u5e93&lt;\/span&gt;\r\n\u00a0&lt;\/li&gt;\r\n\u00a0&lt;li class=<span class=\"hljs-string\">\"favorite\"<\/span>&gt;\r\n\u00a0 &lt;span class=<span class=\"hljs-string\">\"highlight\"<\/span>&gt;\u5165\u5e93&lt;\/span&gt;\r\n\u00a0&lt;\/li&gt;\r\n&lt;\/ul&gt;\r\n&lt;style&gt;\r\n<span class=\"hljs-comment\">#list .favorite:not(#list) .highlight{<\/span>\r\n\u00a0color: red;\r\n}\r\n<span class=\"hljs-comment\">#list .highlight:nth-of-type(1):nth-last-of-type(1){<\/span>\r\n\u00a0color: blue;\r\n}\r\n&lt;\/style&gt;\r\n<span class=\"copy-code-btn\">\u590d\u5236\u4ee3\u7801<\/span><\/code><\/pre>\n<p>A. red B.blue C.black<\/p>\n<p>\u6211\u7684\u7b54\u6848\u662f\uff1a\u6211\u731c\u4e00\u4e0b\uff0c\u53ef\u80fd\u662fA\uff0c\u56e0\u4e3aA\u7684\u6743\u91cd\u662f\u6700\u5927\u7684\uff0c\u4f2a\u7c7b\u9009\u62e9\u5668\u7684\u6743\u503c\u5e94\u8be5\u6bd4\u8f83\u5c0f\u5427\u3002<\/p>\n<p>\u9762\u8bd5\u5b98\u53d1\u6765\u4e00\u4e2a?\uff0c\u660e\u5929\u53ef\u4ee5\u6765\u516c\u53f8\u9762\u8c08\u5417\uff1f\u5df2\u7ecf\u7ea6\u597d\u660e\u5929\u9762\u8bd5\u3002<\/p>\n<p>\u8fd9\u9053\u9898\u7684\u89e3\u7b54\u5230\u6b64\u4e3a\u6b62\uff0c\u56e0\u4e3a\u6211\u662f\u771f\u7684\u771f\u7684\u5bf9CSS\u4e0d\u611f\u5174\u8da3\uff0c\u5404\u4f4d\u770b\u5b98\u8001\u7237\u8bf7\u539f\u8c05\u6211\u3002<\/p>\n<h2 class=\"heading\" data-id=\"heading-12\">\u9762\u8bd5-3 \u672a\u901a\u8fc7<\/h2>\n<h3 class=\"heading\" data-id=\"heading-13\">1.\u8bf4\u4e0b\u4e0b\u9762\u4e24\u79cdfont-size\u5355\u4f4d\u7684\u5f02\u540c\uff1f<\/h3>\n<p>em rem<\/p>\n<p>\u4e8c\u8005\u7684\u4e3a\u4e86\u4fdd\u8bc1\u7528\u6237\u4fee\u6539\u5b57\u4f53\u5927\u5c0f\u65f6\uff0c\u4fdd\u6301\u5782\u76f4\u65b9\u5411\u4e0a\u7684\u5b57\u4f53\u5927\u5c0f\u4e00\u81f4\u3002\u4e0epx\u4e0d\u540c\uff0c\u4e8c\u8005\u90fd\u662f\u5b57\u4f53\u8ba1\u7b97\u5927\u5c0f\u5355\u4f4d\uff0c\u4e5f\u5c31\u662f\u8bf4\uff0c\u9700\u8981\u901a\u8fc7\u8ba1\u7b97\u5f97\u51fa\u5176\u5927\u5c0f\uff0c\u8f6c\u6362\u6210px\uff0c\u5fae\u4fe1\u5c0f\u7a0b\u5e8f\u7684rpx\u4e5f\u662f\u8fd9\u6837\uff0c\u6700\u540e\u8fd8\u662f\u8f6c\u6362\u6210\u4e86px\uff0c\u53ef\u80fd\u662f\u501f\u9274\u4e86rem\u7684\u601d\u60f3\u5427\u3002<\/p>\n<p>\u4f46\u662fem\u76f8\u5bf9\u4e8e\u7ee7\u627f\u6765\u7684\u7236\u5143\u7d20\uff0crem\u76f8\u5bf9\u4e8e\u6839\u5143\u7d20\u3002\u542c\u5927\u725b\u8bf4\uff0crem\u5728\u56fd\u5185\u4f7f\u7528\u6bd4\u8f83\u591a\uff0c\u53ef\u80fd\u4f8d\u4f7f\u7528\u4e60\u60ef\u95ee\u9898\u3002\u6211\u81ea\u5df1\u4e5f\u89c9\u5f97rem\u4f7f\u7528\u8d77\u6765\u66f4\u7b80\u5355\uff0c\u4e3a\u6839\u5143\u7d20\u7684font-size\u8d4b\u4e00\u4e2a\u521d\u59cb\u503c\uff0c\u518d\u914d\u5408css\u7684\u5a92\u4f53\u67e5\u8be2\uff0c\u53ef\u4ee5\u52a8\u6001\u7684\u6539\u53d8\u8fd9\u4e2a\u5168\u5c40\u7684\u5355\u4f4d\uff0c\u53ef\u4ee5\u8bf4\u662f\u7275\u4e00\u53d1\u800c\u52a8\u5168\u8eab\uff0c\u4f7f\u7528\u8d77\u6765\u975e\u5e38\u65b9\u4fbf\uff0c\u800cem\u7684\u53ef\u9605\u8bfb\u6027\u5c31\u5f88\u5dee\u4e86\uff0c\u6709\u7684\u65f6\u5019\u4e3a\u4e86\u7b97\u5b57\u4f53\u5927\u5c0f\uff0c\u9700\u8981\u4e00\u7ea7\u4e00\u7ea7\u627e\u4e0a\u53bb\uff0c\u975e\u5e38\u4e0d\u76f4\u89c2\u3002<\/p>\n<p>\u73b0\u4ee3\u7684\u5e38\u7528\u7684\u6d4f\u89c8\u5668\uff0c1rem\u7b49\u4e8e16px\uff0c\u4f46\u662f\u53ef\u4ee5\u901a\u8fc7<code>html{font-size:percentage\/num }<\/code>\u6765\u63a7\u5236\u3002<\/p>\n<p>\u4e3e2\u4e2a rem\u548cem\u4f8b\u5b50\u5bf9\u6bd4\u4e0b\u3002<\/p>\n<p>html\u7b80\u5199\u7ed3\u6784\uff1a<\/p>\n<pre><code class=\"hljs bash copyable\" lang=\"bash\">&lt;html&gt;\r\n    &lt;body&gt;\r\n        &lt;div&gt;&lt;\/div&gt;\r\n    &lt;\/body&gt;\r\n&lt;\/html&gt;\r\n<span class=\"copy-code-btn\">\u590d\u5236\u4ee3\u7801<\/span><\/code><\/pre>\n<p>rem \u4f8b\u5b50\uff1a<\/p>\n<pre><code class=\"hljs bash copyable\" lang=\"bash\">html { font-size:62.5%; }  \/* =10px *\/\r\nbody { font-size: 2.0rem; } \/* =20px *\/\r\ndiv   { font-size: 1.0rem; } \/* =10px *\/\r\n<span class=\"copy-code-btn\">\u590d\u5236\u4ee3\u7801<\/span><\/code><\/pre>\n<p>em \u4f8b\u5b50\uff1a<\/p>\n<pre><code class=\"hljs bash copyable\" lang=\"bash\">html { font-size:62.5%; }  \/* =10px *\/\r\nbody { font-size: 2.0em; } \/* =20px *\/\r\ndiv   { font-size: 1.0em; } \/* =20px *\/\r\n<span class=\"copy-code-btn\">\u590d\u5236\u4ee3\u7801<\/span><\/code><\/pre>\n<p>MDN\u7684font-size\u7ae0\u8282\u7ed9\u51fa\u4e86em\u548crem\u7684\u975e\u5e38\u597d\u7684\u89e3\u91ca\uff0c\u82f1\u6587\u539f\u7248\u975e\u5e38\u76f4\u89c2\uff0c\u6211\u8fd9\u91cc\u518d\u8d34\u4e00\u4e0b\uff1a<\/p>\n<p>em<\/p>\n<blockquote><p>Represents the calculated font-size of the element. If used on the font-size property itself, it represents the inherited font-size of the element.<\/p><\/blockquote>\n<p>rem<\/p>\n<blockquote><p>Represents the font-size of the root element (typically ). When used within the root element font-size, it represents its initial value (a common browser default is 16px, but user-defined preferences may modify this).<\/p><\/blockquote>\n<p>\u5176\u5b9eem\u548crem\u4e0eMVVM\u6846\u67b6\u7684\u7ec4\u4ef6\u95f4\u901a\u4fe1\u6709\u4e9b\u7c7b\u4f3c\uff0c\u90fd\u6709\u9010\u7ea7\u7ee7\u627f\u548c\u5168\u5c40\u5f71\u54cd\u7684\u6982\u5ff5\u3002em\u662f\u9010\u7ea7\u4f20\u9012\u7684\uff0c\u4e5f\u5c31\u662f\u7ee7\u627f\uff0c\u6846\u67b6\u4e2d\u7528props\u548c\u4e8b\u4ef6\u8ba2\u9605\u53d1\u5e03\u7684\u65b9\u5f0f\u4e5f\u662f\u8fd9\u6837\uff0c\u7237\uff0c\u7236\uff0c\u5b59\u7684\u4f20\u9012\u90fd\u662f\u8981\u4e00\u7ea7\u4e00\u7ea7\u53bb\u4f20\u9012\u7684\uff0c\u7237\u7237\u60f3\u76f4\u63a5\u4f20\u6388\u70b9\u6280\u80fd\u7ed9\u5b59\u5b50\u5fc5\u987b\u5148\u4f20\u6388\u7ed9\u7236\u4eb2\uff0c<strong>\u7237\u7237\u2192\u7236\u4eb2\u2192\u5b59\u5b50<\/strong>\uff1b\u800crem\u5c31\u548c\u6846\u67b6\u4e2d\u7684\u72b6\u6001\u7ba1\u7406\u5e93\u5f88\u50cf\uff0c\u4f8b\u5982vuex\u548credux\uff0c\u62bd\u53d6\u51fa\u4e00\u4e2a\u5168\u5c40\u7684\u72b6\u6001\u6811\uff0c\u4e0d\u7528\u4e00\u7ea7\u4e00\u7ea7\u7684\u53bb\u5f88\u590d\u6742\u7684\u53bb\u7ee7\u627f\uff0c\u7237\u7237\u60f3\u6559\u6559\u5b59\u5b50\uff0c\u76f4\u63a5\u5c31\u53ef\u4ee5\u4f20\u6388\u7ed9\u5b59\u5b50\uff0c<strong>\u7237\u7237\u2192\u5b59\u5b50<\/strong>\u3002<\/p>\n<h3 class=\"heading\" data-id=\"heading-14\">2.\u53ea\u7528\u4e00\u4e2adiv \u5b9e\u73b0\u5b9a\u65f6\u7ea2\u7eff\u706f<\/h3>\n<figure><img decoding=\"async\" class=\"lazyload inited\" src=\"data:;base64,<?xml version=\"1.0\"?><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" version=\"1.1\" width=\"618\" height=\"222\"><\/svg>&#8221; alt=&#8221;default&#8221; data-src=&#8221;https:\/\/user-gold-cdn.xitu.io\/2019\/4\/20\/16a39eec4f11f43b?imageslim&#8221; data-width=&#8221;618&#8243; data-height=&#8221;222&#8243; \/><figcaption><\/figcaption><\/figure>\n<pre><code class=\"hljs bash copyable\" lang=\"bash\">&lt;!DOCTYPE html&gt;\r\n&lt;html lang=<span class=\"hljs-string\">\"zh-cn\"<\/span>&gt;\r\n    &lt;head&gt;\r\n        &lt;meta charset=<span class=\"hljs-string\">\"utf-8\"<\/span> \/&gt;\r\n        &lt;title&gt;\u4ec5\u7528\u4e00\u4e2aDIV\u5b9e\u73b0\u7ea2\u7eff\u706f&lt;\/title&gt;\r\n        &lt;style&gt;\r\n        \t@keyframes light{\r\n        \t\t0%{\r\n        \t\t\tbackground-color: green;\r\n        \t\t\tleft: 0;\r\n        \t\t}\r\n        \t\t33.3%{\r\n        \t\t\tbackground-color: green;\r\n        \t\t\tleft: 0;\r\n        \t\t}\r\n        \t\t33.4%{\r\n        \t\t\tbackground-color: yellow;\r\n        \t\t\tleft: 200px;\r\n        \t\t}\r\n        \t\t66.6%{\r\n        \t\t\tbackground-color: yellow;\r\n        \t\t\tleft: 200px;\r\n        \t\t}\r\n        \t\t66.7%{\r\n        \t\t\tbackground-color: red;\r\n        \t\t\tleft: 400px;\r\n        \t\t}\r\n        \t\t99.9%{\r\n\t       \t\t\tbackground-color: red;\r\n        \t\t\tleft: 400px;\r\n        \t\t}\r\n        \t}\r\n        \t.traffic-light{\r\n        \t\tposition: relative;\r\n        \t\twidth: 200px;\r\n        \t\theight: 200px;\r\n        \t\tborder-radius: 50%;\r\n        \t\tanimation: light 3s ease-in-out 0s infinite;\r\n        \t}\r\n        \t.container{\r\n        \t\twidth: 600px;\r\n        \t\tborder:10px solid <span class=\"hljs-comment\">#000;<\/span>\r\n        \t\tborder-radius: 20% 20%;\r\n        \t}\r\n        &lt;\/style&gt;\r\n    &lt;\/head&gt;\r\n    &lt;body&gt;\r\n    \t&lt;div class=<span class=\"hljs-string\">\"container\"<\/span>&gt;\r\n    \t\t&lt;div class=<span class=\"hljs-string\">\"traffic-light\"<\/span>&gt;&lt;\/div&gt;\r\n    \t&lt;\/div&gt;\r\n    &lt;\/body&gt;\r\n&lt;\/html&gt;\r\n<span class=\"copy-code-btn\">\u590d\u5236\u4ee3\u7801<\/span><\/code><\/pre>\n<h2 class=\"heading\" data-id=\"heading-15\">\u9762\u8bd5-4<\/h2>\n<p>\u7531\u4e8e\u79cd\u79cd\u539f\u56e0\uff0c\u5f00\u59cb\u4e86\u65b0\u4e00\u8f6e\u7684\u9762\u8bd5\uff0c\u8fd9\u4e00\u8f6e\u9762\u8bd5\u53ef\u8c13\u6536\u83b7\u9887\u4e30\u3002 \u4e0e\u5404\u79cd\u5404\u6837\u7684\u9762\u8bd5\u5b98\u4ea4\u6d41\u4e0b\u6765\uff0c\u9664\u4e86\u6536\u83b7\u5230\u4e00\u4e9b\u758f\u6f0f\u7684\u77e5\u8bc6\u70b9\u5916\uff0c\u53d1\u73b0\u9762\u8bd5\u5176\u5b9e\u975e\u5e38\u8003\u9a8c\u9762\u8bd5\u5b98\u7684\u6c34\u5e73\u3002\u63e3\u6469\u51fa\u4e00\u4e9b\u5982\u4f55\u6210\u4e3a\u4e00\u540d\u5408\u683c\u7684\u524d\u7aef\u9762\u8bd5\u5b98\u65b9\u6cd5\u3002<\/p>\n<p>\u4ee5\u53ca\u5f88\u91cd\u8981\u7684\u8001\u54e5\u7684\u7ecf\u9a8c\uff1a\u8fdb\u5927\u5382\u524d\u5fc5\u987b\u8981\u505a\u7684\u51c6\u5907\uff0c\u63d0\u524d\u4e00\u4e2a\u6708\u5237\u9898\u3002<\/p>\n<h3 class=\"heading\" data-id=\"heading-16\">1.setTimeout\u4e0e\u51fd\u6570\u8c03\u7528\u6808<\/h3>\n<pre><code class=\"hljs bash copyable\" lang=\"bash\">console.log(1);\r\n<span class=\"hljs-built_in\">set<\/span>Timeout(<span class=\"hljs-function\"><span class=\"hljs-title\">function<\/span><\/span>(){\r\n    console.log(2);\r\n},0);\r\nconsole.log(3);\r\n<span class=\"copy-code-btn\">\u590d\u5236\u4ee3\u7801<\/span><\/code><\/pre>\n<p>\u8f93\u51fa\uff1a1 3 2 \u539f\u56e0\uff1aCall Stack\u4f1a\u6700\u540e\u8c03\u7528setTimeout\u7684callback\uff0csetTimeout\u4e2d\u7684callback\u662f\u4e00\u4e2a\u5f02\u6b65\u51fd\u6570\u3002 \u51fd\u6570\u8c03\u7528\u6808\u7684\u90e8\u5206\u53ef\u4ee5\u53c2\u8003\u8fd9\u91cc\uff1a<a href=\"https:\/\/blog.risingstack.com\/node-js-at-scale-understanding-node-js-event-loop\/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">blog.risingstack.com\/node-js-at-\u2026<\/a><\/p>\n<h3 class=\"heading\" data-id=\"heading-17\">2.function foo \u4e0e var foo\u7684\u63d0\u5347\u4f18\u5148\u7ea7<\/h3>\n<pre><code class=\"hljs bash copyable\" lang=\"bash\">console.log(typeof foo);\r\nvar foo = <span class=\"hljs-string\">\"foo\"<\/span>;\r\n<span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-function\"><span class=\"hljs-title\">foo<\/span><\/span>(){}\r\n<span class=\"copy-code-btn\">\u590d\u5236\u4ee3\u7801<\/span><\/code><\/pre>\n<p>\u8f93\u51fa\uff1afunction<\/p>\n<pre><code class=\"hljs bash copyable\" lang=\"bash\">console.log(typeof foo);\r\n<span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-function\"><span class=\"hljs-title\">foo<\/span><\/span>(){}\r\nvar foo = <span class=\"hljs-string\">\"foo\"<\/span>;\r\n<span class=\"copy-code-btn\">\u590d\u5236\u4ee3\u7801<\/span><\/code><\/pre>\n<p>\u8f93\u51fa\uff1afunction<\/p>\n<p>function\u4f18\u5148\u7ea7\u6bd4var\u9ad8\uff0c\u65e0\u8bba\u5728\u5176\u524d\u540e\uff0c\u90fd\u4f1a\u8986\u76d6\u6389\u540c\u540d\u7684var\u58f0\u660e\u3002<\/p>\n<h3 class=\"heading\" data-id=\"heading-18\">3.let \u5757\u4f5c\u7528\u57df \u4e0e setTimeout<\/h3>\n<pre><code class=\"hljs bash copyable\" lang=\"bash\"><span class=\"hljs-keyword\">for<\/span>(<span class=\"hljs-built_in\">let<\/span> i=0;i&lt;6;i++){\r\n    <span class=\"hljs-built_in\">set<\/span>Timeout(<span class=\"hljs-function\"><span class=\"hljs-title\">function<\/span><\/span>(){\r\n        console.log(i)\r\n    },0)\r\n}\r\nconsole.log(i)\r\n<span class=\"copy-code-btn\">\u590d\u5236\u4ee3\u7801<\/span><\/code><\/pre>\n<p>\u8f93\u51fa\uff1a<\/p>\n<pre><code class=\"hljs bash copyable\" lang=\"bash\">0\r\nUncaught ReferenceError: i is not defined\r\n1\r\n2\r\n3\r\n4\r\n5\r\n<span class=\"copy-code-btn\">\u590d\u5236\u4ee3\u7801<\/span><\/code><\/pre>\n<ul>\n<li>Uncaught ReferenceError: i is not defined \u7531\u6b64\u53ef\u89c1for\u8bed\u53e5\u7684\u5757\u4f5c\u7528\u57df\uff0c\u4e0d\u4ec5\u4ec5\u5728\u82b1\u62ec\u53f7\u4e2d\u751f\u6548\uff0c\u5728\u5706\u62ec\u53f7\u4e2d\u4e5f\u751f\u6548\u3002<\/li>\n<li>\u8f93\u51fa0 1 2 3 4 5 \u7684\u539f\u56e0 setTimeout\u7684callback\u662f\u5f02\u6b65\u51fd\u6570\uff0cfor\u5faa\u73af\u5b9e\u8d28\u4e0a\u662f\u5728\u505a\u5f02\u6b65\u5faa\u73af\u961f\u5217\uff0csetTimeout\u7684callback\u4f1a\u88ab\u8c03\u75285\u6b21\uff0c\u7531\u4e8elet\u4f1a\u4e3a\u6bcf\u6b21\u7684i\u5206\u914d\u72ec\u7acb\u7684\u5730\u5740\u7a7a\u95f4\uff0c\u56e0\u6b64\u6bcf\u4e00\u6b21\u4f20\u4e0d\u540c\u7684\u503c\u8fdb\u53bb\u3002<\/li>\n<\/ul>\n<p><strong>\u4e3a\u4ec0\u4e48\u5728debug\u7684\u8fc7\u7a0b\u4e2d\uff0c\u6253\u5370\u987a\u5e8f\u662f\u6df7\u4e71\u7684\uff1f<\/strong> (\u7b49\u628a\u89c4\u8303\u7684timers\u7ae0\u8282\u7ffb\u8bd1\u5b8c\uff0c\u518d\u6765\u89e3\u51b3) breakpoint\u6253\u5728console.log(i)\u4e0a\u3002<\/p>\n<pre><code class=\"hljs bash copyable\" lang=\"bash\">Uncaught ReferenceError: i is not defined\r\n0 \r\n2\r\n5\r\n4\r\n3\r\n1\r\n<span class=\"copy-code-btn\">\u590d\u5236\u4ee3\u7801<\/span><\/code><\/pre>\n<p><strong>\u5982\u679c\u5c06let\u66ff\u6362\u6210var\u5462\uff1f<\/strong><\/p>\n<pre><code class=\"hljs bash copyable\" lang=\"bash\"><span class=\"hljs-keyword\">for<\/span>(var i=0;i&lt;6;i++){\r\n    <span class=\"hljs-built_in\">set<\/span>Timeout(<span class=\"hljs-function\"><span class=\"hljs-title\">function<\/span><\/span>(){\r\n        console.log(i)\r\n    },0)\r\n}\r\nconsole.log(i)\r\n<span class=\"copy-code-btn\">\u590d\u5236\u4ee3\u7801<\/span><\/code><\/pre>\n<p>\u8f93\u51fa\uff1a 6\u4e2a6 \u539f\u56e0\uff1a<\/p>\n<ul>\n<li>\u6253\u5370\u7684\u662fwindow.i \u6bcf\u4e2a\u4f20\u5165\u7684i\u6307\u5411\u76f8\u540c\u7684i\uff0c\u4f20\u5165\u65f6\u4f9d\u6b21window.i\u7684\u503c\u4e3a1,2,3,4,5,6\uff0c\u4f46\u662f\u90fd\u662f\u540c\u4e00\u4e2a\u5f15\u7528\uff0c\u5f53\u51fd\u6570\u8c03\u7528\u6808\u5f00\u59cb\u6267\u884csetTimeout\u7684callback\u65f6\uff0cwindow.i\u5df2\u7ecf\u53d8\u4e3a\u4e866<\/li>\n<li>var \u4e0d\u4f1a\u9650\u5236\u5757\u4f5c\u7528\u57df \u4e0d\u4f1a\u5206\u914d6\u4e2a\u72ec\u7acb\u7684\u5730\u5740\u7a7a\u95f4\u7ed9setTimeout\u7684callback<\/li>\n<\/ul>\n<h3 class=\"heading\" data-id=\"heading-19\">4.\u4e3a\u4ec0\u4e48Object.toString.call([1,2,3])\u8fd4\u56de[object Array]\uff1f[].toString()\u53ef\u4ee5\u8fd4\u56de[object Array]\u5417\uff1f<\/h3>\n<p>\u82e5\u60f3\u56de\u7b54\u8fd9\u4e2a\u95ee\u9898\uff0c\u9700\u8981<strong>\u6df1\u5165\u7406\u89e3Object.prototype.toString.call()<\/strong>\u3002<\/p>\n<p>\u96be\u9053\u771f\u7684\u50cf\u81ea\u5df1\u7406\u89e3\u7684\u90a3\u6837\uff0c\u662f\u901a\u8fc7call\u5c06[1,2,3]\u4f5c\u4e3aObject.toString\u7684\u5b9e\u53c2\u4f20\u9012\u4e86\u8fdb\u53bb\u5417\uff1f\u4e0d\u662f\u3002 \u76f4\u63a5Object.toString([1,2,3])\u4e0d\u80fd\u5b9e\u73b0\u540c\u6837\u7684\u529f\u80fd\u5417\uff1f\u4e0d\u80fd\u3002 \u800c\u5b9e\u9645\u4e0a\u4e5f\u6709Array.<strong>proto<\/strong>.toString()\u8fd9\u79cd\u5f62\u5f0f\uff0c\u6240\u4ee5\u662f\u53ef\u4ee5\u76f4\u63a5\u8c03\u7528arr.toString()\u7684\uff0c\u8fd9\u6837\u80fd\u68c0\u6d4b\u51fa\u5417\uff1f\u4e0d\u884c\u3002<\/p>\n<p>\u90a3\u5230\u5e95\u662f\u4ec0\u4e48\u539f\u56e0\uff1f \u5148\u6765\u809d\u4e00\u4e2a\u8868\u683c\u3002<\/p>\n<hr \/>\n<table>\n<thead>\n<tr>\n<th>\u6570\u636e\u7c7b\u578b<\/th>\n<th>\u4f8b\u5b50<\/th>\n<th>return<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>\u5b57\u7b26\u4e32<\/td>\n<td>&#8220;foo&#8221;.toString()<\/td>\n<td>&#8220;foo&#8221;<\/td>\n<\/tr>\n<tr>\n<td>\u6570\u5b57<\/td>\n<td>1.toString()<\/td>\n<td>Uncaught SyntaxError: Invalid or unexpected token<\/td>\n<\/tr>\n<tr>\n<td>\u5e03\u5c14\u503c<\/td>\n<td>false.toString()<\/td>\n<td>&#8220;false&#8221;<\/td>\n<\/tr>\n<tr>\n<td>undefined<\/td>\n<td>undefined.toString()<\/td>\n<td>Uncaught TypeError: Cannot read property &#8216;toString&#8217; of undefined<\/td>\n<\/tr>\n<tr>\n<td>null<\/td>\n<td>null.toString()<\/td>\n<td>Uncaught TypeError: Cannot read property &#8216;toString&#8217; of null<\/td>\n<\/tr>\n<tr>\n<td>String<\/td>\n<td>String.toString()<\/td>\n<td>&#8220;function String() { [native code] }&#8221;<\/td>\n<\/tr>\n<tr>\n<td>Number<\/td>\n<td>Number.toString()<\/td>\n<td>&#8220;function Number() { [native code] }&#8221;<\/td>\n<\/tr>\n<tr>\n<td>Boolean<\/td>\n<td>Boolean.toString()<\/td>\n<td>&#8220;function Boolean() { [native code] }&#8221;<\/td>\n<\/tr>\n<tr>\n<td>Array<\/td>\n<td>Array.toString()<\/td>\n<td>&#8220;function Array() { [native code] }&#8221;<\/td>\n<\/tr>\n<tr>\n<td>Function<\/td>\n<td>Function.toString()<\/td>\n<td>&#8220;function Function() { [native code] }&#8221;<\/td>\n<\/tr>\n<tr>\n<td>Date<\/td>\n<td>Date.toString()<\/td>\n<td>&#8220;function Date() { [native code] }&#8221;<\/td>\n<\/tr>\n<tr>\n<td>RegExp<\/td>\n<td>RegExp.toString()<\/td>\n<td>&#8220;function RegExp() { [native code] }&#8221;<\/td>\n<\/tr>\n<tr>\n<td>Error<\/td>\n<td>Error.toString()<\/td>\n<td>&#8220;function Error() { [native code] }&#8221;<\/td>\n<\/tr>\n<tr>\n<td>Promise<\/td>\n<td>Promise.toString()<\/td>\n<td>&#8220;function Promise() { [native code] }&#8221;<\/td>\n<\/tr>\n<tr>\n<td>Obejct<\/td>\n<td>Object.toString()<\/td>\n<td>&#8220;function Object() { [native code] }&#8221;<\/td>\n<\/tr>\n<tr>\n<td>Math<\/td>\n<td>Math.toString()<\/td>\n<td>&#8220;[object Math]&#8221;<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u4e3a\u4ec0\u4e48\u4f1a\u51fa\u73b0\u4e0b\u9762\u7684\u60c5\u51b5\uff1f<\/p>\n<pre><code class=\"hljs bash copyable\" lang=\"bash\">Object.toString.call(Array)\/\/<span class=\"hljs-string\">\"function Array() { [native code] }\"<\/span>\r\nObject.prototype.toString.call(Array)\/\/<span class=\"hljs-string\">\"[object Function]\"<\/span>\r\n<span class=\"copy-code-btn\">\u590d\u5236\u4ee3\u7801<\/span><\/code><\/pre>\n<p>\u7b54\u6848\u5728\u8fd9\u91cc\uff01<\/p>\n<pre><code class=\"hljs bash copyable\" lang=\"bash\">Object.toString()\/\/<span class=\"hljs-string\">\"function Object() { [native code] }\"<\/span>\r\nObject.prototype.toString()\/\/<span class=\"hljs-string\">\"[object Object]\"<\/span>\r\n<span class=\"copy-code-btn\">\u590d\u5236\u4ee3\u7801<\/span><\/code><\/pre>\n<p>Object\u5bf9\u8c61\u548c\u5b83\u7684\u539f\u578b\u94fe\u4e0a\u5404\u81ea\u6709\u4e00\u4e2atoString()\u65b9\u6cd5\uff0c\u7b2c\u4e00\u4e2a\u8fd4\u56de\u7684\u662f\u4e00\u4e2a\u51fd\u6570\uff0c\u7b2c\u4e8c\u4e2a\u8fd4\u56de\u7684\u662f\u503c\u7c7b\u578b\u3002<\/p>\n<p>\u65e2\u7136\u77e5\u9053\u4e86\u4e0d\u540c\uff0c\u73b0\u5728\u6211\u4eec\u518d\u6765\u5206\u6790\u4e0b<code>Object.prototype.toString.call(Array)\/\/\"[object Function]\"<\/code>\u3002 Array\u5bf9\u8c61\u672c\u8eab\u8fd4\u56de\u4e00\u4e2a\u6784\u9020\u51fd\u6570\uff0cArray\/\/\u0192 Array() { [native code] }\uff0c\u800cObject.prototype.toString()\u8fd4\u56de\u7684\u662f\/\/&#8221;[object Type]&#8221;\u7684\u5f62\u5f0f\uff0c\u901a\u8fc7call\u5c06Array\u7684this\u4e0a\u4e0b\u6587\u5207\u6362\u5230Object\uff0c\u4ece\u800c\u8c03\u7528\u4e86Object.prototype.toString()\uff0c\u56e0\u6b64\u8fd4\u56de<code>[object Function]<\/code>\u3002<\/p>\n<p>\u9700\u8981\u6ce8\u610f\u7684\u662f\uff1aMath.toString()\u76f4\u63a5\u8fd4\u56de&#8221;[object Math]&#8221;\u3002<\/p>\n<p>\u5b9e\u9645\u5f00\u53d1\u4e2d\uff0c\u6211\u4eec\u7528\u5230\u6700\u591a\u7684\u53ef\u80fd\u662f\uff1aObject.prototype.toString.call([1,2,3])\/\/&#8221;[object Array]&#8221;\u8fd9\u79cd\u3002<\/p>\n<p>\u603b\u7ed3\uff1a<\/p>\n<ul>\n<li>\u4e00\u822c\u60c5\u51b5\u4e0b\uff0cjs\u4e2d\u5bf9\u8c61\u7684toString()\uff0c\u8fd4\u56de\u5b57\u7b26\u4e32\uff0c\u5185\u5bb9\u4e0e\u51fd\u6570\u58f0\u660e\u8bed\u6cd5\u6709\u5173\uff0c\u4f8b\u5982[1,2,3].toString()\/\/&#8221;1,2,3&#8243;<\/li>\n<li>\u5927\u591a\u6570\u90fd\u8fd4\u56de\u51fd\u6570\u7684\u5b8c\u6574\u6e90\u7801\uff0cArray.toString()\/\/&#8221;function Array() { [native code] }&#8221;<\/li>\n<li>\u5185\u7f6e\u51fd\u6570\u5f80\u5f80\u8fd4\u56de\u4e00\u4e2a\u7c7b\u4f3c&#8221;[native code]&#8221;\u7684\u51fd\u6570\u4f53\uff0c\u9700\u8981\u914d\u5408call\u65b9\u6cd5\uff0c\u6bd4\u5982Object.prototype.toString.call([1,2,3])\/\/&#8221;[object Array]&#8221;<\/li>\n<\/ul>\n<p>\u90a3\u4e48\u4e0d\u53ef\u4ee5\u76f4\u63a5Array.prototype.toString.call([1,3,4])\u5417\uff1f \u4e0d\u884c\uff01 \u56e0\u4e3aArray\uff0cFunction\uff0cDate\u867d\u7136\u662f\u57fa\u4e8eObject\u8fdb\u884c\u521b\u5efa\u7684\uff0c\u4f46\u662f\u4ed6\u4eec<strong>\u7ee7\u627f\u7684\u662fObject.toString()\uff0c\u800c\u4e0d\u662fObject.prototype.toString()\u3002<\/strong> \u518d\u52a0\u6df1\u4e00\u904d\u5370\u8c61\uff1a<\/p>\n<pre><code class=\"hljs bash copyable\" lang=\"bash\">Object.toString()\/\/<span class=\"hljs-string\">\"function Object() { [native code] }\"<\/span>\r\nObject.prototype.toString()\/\/<span class=\"hljs-string\">\"[object Object]\"<\/span>\r\n<span class=\"copy-code-btn\">\u590d\u5236\u4ee3\u7801<\/span><\/code><\/pre>\n<p>\u6240\u4ee5\u8fd9\u5c31\u662f\u5fc5\u987b\u7528Object.prototype.toString()\u53bb\u68c0\u6d4b\u7c7b\u578b\u7684\u539f\u56e0\u3002<\/p>\n<p>\u81f3\u4e8eObject.prototype.toString()\u5185\u90e8\u662f\u600e\u4e48\u5b9e\u73b0\u7684\uff0c\u7b49\u5230\u65f6\u673a\u6210\u719f\u518d\u53bb\u6df1\u5165\u3002<\/p>\n<h3 class=\"heading\" data-id=\"heading-20\">5.\u7efc\u5408\u8003\u5bdfbind\uff0ccall\u548capply\u7684\u9762\u8bd5\u9898<\/h3>\n<pre><code class=\"hljs bash copyable\" lang=\"bash\">var obj = {\r\n    a: 1,\r\n    name: <span class=\"hljs-string\">'world'<\/span>,\r\n    objSayName: <span class=\"hljs-keyword\">function<\/span> (fn) {\r\n    \tfn();\r\n    }\r\n}\r\n<span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-function\"><span class=\"hljs-title\">sayName<\/span><\/span> () {\r\n\t<span class=\"hljs-built_in\">return<\/span> console.log(this.name);\r\n}\r\nobj.objSayName(sayName);\r\n\/\/ \u8f93\u51fa\uff1aundefined\r\n<span class=\"copy-code-btn\">\u590d\u5236\u4ee3\u7801<\/span><\/code><\/pre>\n<p>\u4e3a\u4ec0\u4e48\uff1f \u5728obj\u7684objSayName\u5185\u90e8\uff0c\u6ca1\u6709\u4fee\u6539this\u6307\u5411\u5230\u5f53\u524d\u8c03\u7528\u5bf9\u8c61\u3002<\/p>\n<p>\u9898\u76ee\u4e00\uff1a\u5bf9\u8c61\u5185\u90e8\u65b9\u6cd5\uff0c\u8c03\u7528\u5168\u5c40\u7684\u51fd\u6570 \u9002\u7528\uff1a\u591a\u4e2a\u5bf9\u8c61\uff08\u5c40\u90e8\u65b9\u6cd5\uff09\u590d\u7528\u540c\u4e00\u5168\u5c40\u51fd\u6570 \u7cbe\u7b80\uff1a\u5c40\u90e8\uff08\u65b9\u6cd5\uff09\u590d\u7528\u5168\u5c40\u51fd\u6570 \u65b9\u6cd5\uff1a\u4fee\u6539this\u6307\u5411\uff0c\u901a\u8fc7Function.prototype.bind()\u53bb\u663e\u5f0f\u4fee\u6539this\u6307\u5411\u5230\u5f53\u524d\u8c03\u7528\u5bf9\u8c61\u3002 \u539f\u56e0\uff1aCalling f.bind(someObject) creates a new function with the same body and scope as f, but where this occurs in the original function,in the new function it is permanently bound to the first argument of bind, regardless of how the function is being used.bind only works once!<\/p>\n<pre><code class=\"hljs bash copyable\" lang=\"bash\">var obj = {\r\n    name: <span class=\"hljs-string\">'1'<\/span>,\r\n    objSayName: <span class=\"hljs-keyword\">function<\/span> (f) {\r\n      var g = f.bind(this);\r\n\t  console.log(g());\r\n    }\r\n};\r\n<span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-function\"><span class=\"hljs-title\">sayName<\/span><\/span>(){\r\n    <span class=\"hljs-built_in\">return<\/span> this.name;\r\n}\r\nobj.objSayName(sayName);\r\n\r\n<span class=\"copy-code-btn\">\u590d\u5236\u4ee3\u7801<\/span><\/code><\/pre>\n<p>\u8f93\u51fa\uff1a&#8217;1&#8242;<\/p>\n<p>\u62d3\u5c55\uff1a \u9898\u76ee\u4e8c\uff1a\u5982\u679c\u5168\u5c40\u65b9\u6cd5\u60f3\u8f93\u51fa\u5bf9\u8c61\u7684\u5c40\u90e8\u5c5e\u6027\uff0c\u8be5\u600e\u4e48\u529e\uff1f \u9002\u7528\uff1a\u540c\u4e00\u5168\u5c40\u51fd\u6570\u8f93\u51fa\u591a\u4e2a\u5bf9\u8c61\uff08\u5185\u90e8\u53d8\u91cf\uff09 \u7cbe\u7b80\uff1a\u5168\u5c40\u51fd\u6570\u8f93\u51fa\u5c40\u90e8\uff08\u53d8\u91cf\uff09 \u65b9\u6cd5\uff1a\u4f7f\u7528apply\u6216\u8005call\u4fee\u6539this\u6307\u5411\u5230\u88ab\u8c03\u7528\u5bf9\u8c61 \u539f\u56e0\uff1aAn object can be passed as the first argument to call or apply and this will be bound to it.<\/p>\n<pre><code class=\"hljs bash copyable\" lang=\"bash\">var obj = {\r\n    name: <span class=\"hljs-string\">'1'<\/span>,\r\n    say: <span class=\"hljs-keyword\">function<\/span> (fn) {\r\n        fn();\r\n    }\r\n};\r\n<span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-function\"><span class=\"hljs-title\">sayName<\/span><\/span>(){\r\n    <span class=\"hljs-built_in\">return<\/span> this.name;\r\n}\r\nsayName.apply(obj);\r\nsayName.call(obj);\r\n\/\/ \u8f93\u51fa\uff1a<span class=\"hljs-string\">'1'<\/span>\r\n<span class=\"copy-code-btn\">\u590d\u5236\u4ee3\u7801<\/span><\/code><\/pre>\n<p>\u53c2\u8003\uff1a<a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/JavaScript\/Reference\/Operators\/this\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">developer.mozilla.org\/en-US\/docs\/\u2026<\/a><\/p>\n<h2 class=\"heading\" data-id=\"heading-21\">\u9762\u8bd5 \u6574\u4e2a\u6c5f\u6e56\u90fd\u4efb\u6211\u95ef\uff0c\u6211\u7684\u751f\u547d\u50cf\u4e00\u9996\u6b4c<\/h2>\n<p>\u73b0\u4e1c\u5bb6\u7684\u9762\u8bd5\u9898\uff0c\u662f\u6211\u6700\u6b23\u8d4f\u7684\u4e00\u5957\u9762\u8bd5\u9898\uff0c\u5728\u8fd9\u91cc\u5df2\u7ecf\u5de5\u4f5c\u4e86\u63a5\u8fd11\u5e74\u65f6\u95f4\uff0c\u6210\u957f\u8bb8\u591a\u3002<\/p>\n<p>\u9898\u76ee\u4e3b\u8981\u5206\u4e3a4\u4e2a\u90e8\u5206\uff1a<\/p>\n<ul>\n<li>HTML<\/li>\n<li>CSS<\/li>\n<li>JS<\/li>\n<li>\u4ee3\u7801<\/li>\n<\/ul>\n<p>\u7b54\u6848\u672a\u9a8c\u8bc1\u51c6\u786e\u6027\uff0c\u6709\u5f85\u9a8c\u8bc1\u5e76\u66f4\u65b0\u3002 \u6211\u5c06\u6309\u7167\u201c1 year before\u201d\u548c\u201ctoday\u201d\u7684\u89d2\u5ea6\u53bb\u8fdb\u884c\u89e3\u7b54\uff0c\u4e5f\u662f\u5bf9\u81ea\u5df1\u6210\u957f\u7684\u4e00\u4e2a\u8bb0\u5f55\u3002<\/p>\n<h3 class=\"heading\" data-id=\"heading-22\">HTML<\/h3>\n<h4 class=\"heading\" data-id=\"heading-23\">1.\u8bf7\u63cf\u8ff0cookies, sessionStorage\u548clocalStorage\u7684\u533a\u522b<\/h4>\n<p><strong>1 year before:<\/strong> cookies\uff0c\u9700\u8981\u4e0e\u540e\u7aef\u534f\u4f5c\uff0c\u4e00\u79cd\u8ba4\u8bc1\u65b9\u5f0f\uff0cexpires\u5931\u6548\u65f6\u95f4 sessionStorage\uff0c\u5f53\u524d\u4f1a\u8bdd\u6709\u6548 localStorage\uff0c\u672c\u5730\u7f13\u5b58\uff0cexpires\u5931\u6548\u65f6\u95f4 <strong>today:<\/strong><\/p>\n<h5 class=\"heading\" data-id=\"heading-24\"><strong>cookies<\/strong><\/h5>\n<ul>\n<li>\u4e00\u4e2aHTTP cookie\uff08<strong>web cookie<\/strong>\uff0c<strong>browser cookie<\/strong>\uff09\u662f\u670d\u52a1\u5668\u53d1\u9001\u7ed9\u7528\u6237web\u6d4f\u89c8\u5668\u7684\u4e00\u5c0f\u6bb5\u6570\u636e\u6bb5\u3002<\/li>\n<li>\u6d4f\u89c8\u5668\u53ef\u4ee5\u628a\u5b83\u5b58\u5728\u81ea\u5df1\u672c\u5730\uff0c\u5e76\u4e14\u5c06\u5b83\u5728\u4e0b\u4e00\u4e2a\u8bf7\u6c42\u4e2d\u53d1\u9001\u7ed9\u5b83\u7684\u6570\u636e\u6e90\u670d\u52a1\u5668\u3002<\/li>\n<li>\u5178\u578b\u7684\u5e94\u7528\u573a\u666f\u5c31\u662f\u53bb<strong>\u5224\u65ad\u4e24\u4e2a\u8bf7\u6c42\u662f\u5426\u6765\u81ea\u540c\u4e00\u4e2a\u670d\u52a1\u5668<\/strong>&#8212;-<strong>\u6765\u81ea\u540c\u4e00\u4e2a\u767b\u5f55\u7528\u6237<\/strong>\uff0c\u5b83\u662f\u5bf9\u65e0\u72b6\u6001\u7684HTTP\u534f\u8bae\u7684\u4e00\u79cd\u6709\u72b6\u6001\u8bb0\u5fc6\u3002<\/li>\n<\/ul>\n<h5 class=\"heading\" data-id=\"heading-25\"><strong>sessionStorage<\/strong><\/h5>\n<ul>\n<li>key\/value\u7684\u65b9\u5f0f\u5b58\u50a8\uff0c\u4f1a\u8bdd\u5b58\u50a8<\/li>\n<li>\u4e3a\u6bcf\u4e00\u4e2a\u7ed9\u5b9a\u7684origin\u7ef4\u62a4\u4e00\u4e2a\u5206\u79bb\u7684storage\u533a\u57df\uff0c\u5728<strong>\u9875\u9762\u4f1a\u8bdd\u671f\u95f4\u53ef\u7528<\/strong><\/li>\n<\/ul>\n<h5 class=\"heading\" data-id=\"heading-26\"><strong>localStorage<\/strong><\/h5>\n<ul>\n<li>key\/value\u7684\u65b9\u5f0f\u5b58\u50a8\uff0c\u6301\u4e45\u5316\u5b58\u50a8<\/li>\n<li><strong>\u6d4f\u89c8\u5668\u5173\u95ed\u540e\u91cd\u65b0\u6253\u5f00\uff0clocalStorage\u7684\u952e\u503c\u5bf9\u4ecd\u7136\u5b58\u5728<\/strong><\/li>\n<\/ul>\n<h4 class=\"heading\" data-id=\"heading-27\">2.\u8bf7\u89e3\u91ca<code>&lt;script&gt;<\/code>\u3001<code>&lt;script async&gt;<\/code>\u548c<code>&lt;script defer&gt;<\/code>\u533a\u522b<\/h4>\n<p><strong>1 year before:<\/strong> \u5e38\u89c1\u7684\u540c\u6b65\uff1b\u5f02\u6b65\uff1b\u5ef6\u8fdf\u52a0\u8f7d\u3002<\/p>\n<p><strong>today:<\/strong><\/p>\n<ul>\n<li><code>&lt;script async&gt;<\/code><strong>\u63a7\u5236\u6d4f\u89c8\u5668\u540c\u5f02\u6b65\u52a0\u8f7d\u811a\u672c<\/strong>\u3002\u82e5\u8bbe\u7f6easync\u4e3afalse\uff0c\u90a3\u4e48\u6d4f\u89c8\u5668\u5728HTML\u89e3\u6790\u671f\u95f4\u540c\u6b65\u52a0\u8f7d\u811a\u672c\u3002\u4e00\u822c\u6765\u8bf4\u901a\u8fc7\u4ee3\u7801<code>document.creatElement()<\/code>\u63d2\u5165\u811a\u672c\u662f\u5f02\u6b65\u7684\uff0c\u8bbe\u7f6easync\u4e3afalse\u53ef\u4ee5\u5c06\u5176\u63a7\u5236\u4e3a\u540c\u6b65\u3002<\/li>\n<li><code>&lt;script defer&gt;<\/code>defer\u5c5e\u6027\u7528\u6765<strong>\u63a7\u5236script\u662f\u5426\u5728HTML\u5b8c\u6210\u89e3\u6790\u4e4b\u540e\u518d\u6267\u884c<\/strong>\uff0c\u4f46\u662f\u4f1a\u5728<code>DOMContentLoad<\/code>\u71c3\u70e7\u4e4b\u524d\u5b8c\u6210\u3002<\/li>\n<\/ul>\n<p>\u62d3\u5c55\uff1a 1.\u4ec0\u4e48\u662f<code>DOMContentLoaded<\/code>\u4e8b\u4ef6\uff1f DOMContentLoaded\u4e8b\u4ef6\uff0c\u4f1a\u5728\u521d\u59cb\u5316HTML document\u5b8c\u6210\u52a0\u8f7d\u548c\u89e3\u6790\u89e6\u53d1\uff0c\u65e0\u9700\u7b49\u5f85stylesheets\uff0cimages\uff0c\u4ee5\u53ca\u5b57frame\u7ed3\u675f\u52a0\u8f7d\u3002<code>Load<\/code>\u4e8b\u4ef6\u548c<code>DOMContentLoaded<\/code>\u4e8b\u4ef6\u5f88\u7c7b\u4f3c\uff0c\u7ecf\u5e38\u6709\u4eba\u6df7\u6dc62\u4e2a\u4e8b\u4ef6\u3002 2.\u4ec0\u4e48\u662f<code>Load<\/code>\u4e8b\u4ef6\uff1f load\u4e8b\u4ef6\uff0c\u4f1a\u5728\u5b8c\u6210\u4e00\u6b21\u5b8c\u5168\u52a0\u8f7d\u4e4b\u540e\u518d\u89e6\u53d1\u3002 3.\u5982\u4f55\u89e3\u51b3\u540c\u6b65js\u963b\u585eDOM\u6e32\u67d3\u7684\u95ee\u9898\uff0c\u6700\u5feb\u901f\u5ea6\u6e32\u67d3DOM\uff1f <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/API\/XMLHttpRequest\/Synchronous_and_Asynchronous_Requests\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">\u5f02\u6b65\u5316js<\/a>\uff0c<a href=\"https:\/\/developers.google.com\/speed\/docs\/insights\/OptimizeCSSDelivery\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">\u4f18\u5316stylesheets\u52a0\u8f7d\u3002<\/a> 4.\u5982\u4f55\u68c0\u67e5document\u662f\u5426\u5b8c\u6210\u52a0\u8f7d\uff1f <code>document.readyState<\/code>\u3002<\/p>\n<ul>\n<li>loading \u52a0\u8f7d\u4e2d\u3002<\/li>\n<li>interactive document\u5b8c\u6210\u52a0\u8f7d\uff0cdocument\u5df2\u7ecf\u88ab\u89e3\u6790\u4f46\u662f\u5b50\u8d44\u6e90\u4f8b\u5982images\u3001stylesheets\u548cframe\u8d48\u707e\u52a0\u8f7d\u3002<\/li>\n<li>complete document\u4ee5\u53ca\u5b50\u8d44\u6e90\u90fd\u5df2\u52a0\u8f7d\u5b8c\u6210\uff0c\u6b64\u65f6\u4f1a\u89e6\u53d1load\u4e8b\u4ef6\u3002<\/li>\n<\/ul>\n<p>\u6240\u4ee5\u4e00\u6b21\u52a0\u8f7d\u6587\u6863\u8d44\u6e90\u7684\u72b6\u6001\u67093\u4e2a\uff0c<code>loading``interactive<\/code>\u548c<code>complete<\/code>\u3002<\/p>\n<h4 class=\"heading\" data-id=\"heading-28\">3.\u4e3a\u4ec0\u4e48\u901a\u5e38\u63a8\u8350\u5c06CSS \u653e\u7f6e\u5728<code>&lt;head&gt;&lt;\/head&gt;<\/code>\u4e4b\u95f4\uff0c\u800c\u5c06js<code>&lt;script&gt;&lt;\/script&gt;<\/code>\u653e\u7f6e\u5728<code>&lt;\/body&gt;<\/code>\u4e4b\u524d\uff1f<\/h4>\n<p><strong>1 year before:<\/strong> \u9632\u6b62\u963b\u585e\u6d4f\u89c8\u5668\u6e32\u67d3\uff0c\u5148\u6267\u884cCSSOM\uff0c\u518d\u7ed8\u5236DOM\uff0c\u518d\u64cd\u4f5cDOM\u3002\u4e3b\u7ebf\u7a0b\u5355\u7ebf\u7a0b\u6e32\u67d3UI\u3002<\/p>\n<p><strong>today<\/strong> \u4ece\u6280\u672f\u5b9e\u73b0\u7684\u89d2\u5ea6\u8bb2\uff0c\u5148\u52a0\u8f7dstylesheets\u5e76\u4e14\u7ed8\u5236\uff0cDOM\u6e32\u67d3\u7ed3\u675f\u540e\u518d\u52a0\u8f7d\u5e76\u6267\u884c\u53ef\u80fd\u6d89\u53caDOM\u64cd\u4f5c\u7684js\u6587\u4ef6\uff0c\u907f\u514djs\u7684\u6267\u884c\u5bfc\u81f4\u6e32\u67d3\u963b\u585e\u3002 \u4ece\u7528\u6237\u4f53\u9a8c\u7684\u89d2\u5ea6\u8bb2\uff0c\u4f18\u5148\u52a0\u8f7d\u6837\u5f0f\u8868\u51cf\u5c11\u7528\u6237\u9762\u5bf9\u7a7a\u767d\u7f51\u9875\u7684\u65f6\u95f4\uff0c\u63d0\u5347\u7528\u6237\u4f53\u9a8c\u3002<\/p>\n<h3 class=\"heading\" data-id=\"heading-29\">CSS<\/h3>\n<h4 class=\"heading\" data-id=\"heading-30\">1.CSS\u4e2d\u7c7b\uff08classes\uff09\u548cID\u7684\u533a\u522b<\/h4>\n<p><strong>1 year before<\/strong> \u2460ID\u4f18\u5148\u7ea7\u9ad8 \u2461ID\u552f\u4e00\u6807\u8bc6\uff0c\u4e0d\u80fd\u91cd\u590d<\/p>\n<p><strong>today<\/strong> \u2460\u8bed\u6cd5\u4e0d\u540c\uff0c#idname, .classname \u2461\u5f71\u54cd\u5143\u7d20\u4e0d\u540c\uff0c#idname\u4f5c\u7528\u5355\u4e2a\u5143\u7d20\uff0c.classname\u4f5c\u7528\u6240\u6709\u5143\u7d20 \u2462\u9009\u62e9\u5668\u6743\u91cd\u4e0d\u540c\uff0c#idname\u6743\u503c\u9ad8\u4e8e.classname<\/p>\n<h4 class=\"heading\" data-id=\"heading-31\">2.\u6709\u54ea\u4e9b\u9690\u85cfDOM\u7684\u65b9\u6cd5<\/h4>\n<p><strong>1 year before<\/strong><\/p>\n<ul>\n<li>display: none<\/li>\n<li>position: top right bottom left<\/li>\n<li>transform<\/li>\n<li>z-index<\/li>\n<li>\u79fb\u9664DOM\u8282\u70b9\uff08JS\uff09<\/li>\n<\/ul>\n<p><strong>today<\/strong> <a href=\"https:\/\/github.com\/FrankKai\/FrankKai.github.io\/issues\/142\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">[\u8bd1]\u5982\u4f55\u9690\u85cfDOM\u5143\u7d20\uff1f<\/a><\/p>\n<h4 class=\"heading\" data-id=\"heading-32\">3.\u8bf7\u89e3\u91ca<code>*{ box-sizing: border-box }<\/code>\u7684\u4f5c\u7528\uff0c\u5e76\u4e14\u8bf4\u660e\u4f7f\u7528\u5b83\u6709\u4ec0\u4e48\u597d\u5904\uff1f<\/h4>\n<p><strong>1 year before<\/strong> \u602a\u5f02\u76d2\u6a21\u578b\u3002 \u8ba1\u7b97\u65b9\u4fbf\uff0cwidth\u5305\u542b\u4e86border\uff0c\u54cd\u5e94\u5f0f\u767e\u5206\u6bd4\u5e03\u5c40\u3002<\/p>\n<p><strong>today<\/strong> box-sizing\u7684\u503c\u67092\u79cd\uff0c\u4e00\u4e2a\u662fcontent-box\uff0c\u4e00\u4e2a\u662fborder-box\uff0ccontent-box\u4ec5\u4ec5\u5305\u542bcontent\u3002 border-box\u7684width\u4f1a\u5c06content, padding\u548cborder\u5305\u542b\u5728\u5185\uff0c\u4f8b\u5982width:100%\u6307\u7684\u662f\u5305\u542b\u4e86content\uff0cpadding\u548cborder\u7684\u5bbd\u5ea6\uff0c\u5e03\u5c40\u65f6\u66f4\u597d\u63a7\u5236\u3002<\/p>\n<p>\u4f8b\u5982\u5b50\u5143\u7d20\u7ee7\u627f\u4e86\u7236\u5143\u7d20\u7684width:100%\uff0c\u6b64\u65f6\u8bbe\u7f6e\u4e86\u5b50\u5143\u7d20padding\uff0cborder\uff0c\u82e5\u5b50\u5143\u7d20\u7684box-sizing\u662fcontent-box\uff0c\u4f1a\u5bfc\u81f4\u6ea2\u51fa\uff0c\u800cborder-box\u7684\u8bdd\uff0cwidth:100%\u4f1a\u5f88\u8212\u670d\u5730\u5305\u542b\u4e86padding\u548cborder\u3002<\/p>\n<p>\u56e0\u4e3a\u8fd9\u6837\u7684\u5e94\u7528\u573a\u666f\u5f88\u591a\uff0c\u6240\u4ee5\u7d22\u6027\u5c31\u4e3a\u6240\u6709\u6807\u7b7e\u90fd\u8bbe\u7f6e\u6210border-box\uff0c\u6709\u7279\u6b8a\u60c5\u51b5\u7684\u518d\u624b\u52a8\u8bbe\u7f6e\u6210content-box\u3002<\/p>\n<figure><img decoding=\"async\" class=\"lazyload inited\" src=\"data:;base64,<?xml version=\"1.0\"?><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" version=\"1.1\" width=\"757\" height=\"397\"><\/svg>&#8221; alt=&#8221;image&#8221; data-src=&#8221;https:\/\/user-gold-cdn.xitu.io\/2019\/4\/25\/16a54b265484fcb6?imageView2\/0\/w\/1280\/h\/960\/format\/webp\/ignore-error\/1&#8243; data-width=&#8221;757&#8243; data-height=&#8221;397&#8243; \/><figcaption><\/figcaption><\/figure>\n<p>\u6709\u4e00\u7bc7\u5899\u63a8IE\u602a\u5f02\u76d2\u6a21\u578b\u7684\u6587\u7ae0\uff1a<a href=\"https:\/\/css-tricks.com\/international-box-sizing-awareness-day\/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">\u628a\u6240\u6709\u5143\u7d20\u7684box-sizing\u90fd\u8bbe\u7f6e\u6210border-box\u5427\uff01<\/a><\/p>\n<h4 class=\"heading\" data-id=\"heading-33\">4.\u8bf7\u95ee\u5728\u786e\u5b9a\u6837\u5f0f\u7684\u8fc7\u7a0b\u4e2d\u4f18\u5148\u7ea7\u662f\u5982\u4f55\u51b3\u5b9a\u7684(\u8bf7\u4e3e\u4f8b)\uff1f\u5982\u4f55\u4f7f\u7528\u6b64\u7cfb\u7edf\uff1f<\/h4>\n<p><strong>1 year before<\/strong><\/p>\n<ul>\n<li>style\u5c5e\u6027 <code>&lt;div style=\"\"&gt;&lt;\/div&gt;<\/code><\/li>\n<li>id<\/li>\n<li>\u6807\u7b7e\u540d<\/li>\n<li>class<\/li>\n<li>\u4f2a\u7c7b<\/li>\n<\/ul>\n<p>\u6bcf\u4e2a\u9009\u62e9\u5668\u90fd\u6709\u6743\u503c\uff0c\u6743\u91cd\u4e3a\u548c\uff0c#foo&gt;.class::before \u4e09\u8005\u548c\u4e3a\u6743\u91cd\uff0c\u6743\u503cid&gt;\u6807\u7b7e&gt;class&gt;\u4f2a\u7c7b\u3002<\/p>\n<p><strong>today<\/strong> \u4f18\u5148\u7ea7\u7531\u9ad8\u5230\u4f4e<\/p>\n<ul>\n<li>!important \u4e0d\u5efa\u8bae\u7684\u5b9e\u8df5<\/li>\n<li>\u884c\u5185\u6837\u5f0f <code>&lt;span style=\"\"&gt;&lt;\/span&gt;<\/code><\/li>\n<li>ID\u9009\u62e9\u5668 #foo<\/li>\n<li>\u7c7b\u9009\u62e9\u5668.foo\uff0c\u5c5e\u6027\u9009\u62e9\u5668[type=&#8221;radio&#8221;]\uff0c\u4f2a\u7c7b:hover<\/li>\n<li>\u7c7b\u578b\u9009\u62e9\u5668p,span\uff0c\u4f2a\u5143\u7d20::before<\/li>\n<\/ul>\n<p>\u4e00\u4e2a\u5f88\u4f18\u79c0\u7684\u8bf4\u660ecss\u9009\u62e9\u5668\u4f18\u5148\u7ea7\u7684\u56fe\uff1a<a href=\"https:\/\/specifishity.com\/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">specifishity.com\/<\/a><\/p>\n<figure><img decoding=\"async\" class=\"lazyload inited\" src=\"data:;base64,<?xml version=\"1.0\"?><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" version=\"1.1\" width=\"989\" height=\"1280\"><\/svg>&#8221; alt=&#8221;image&#8221; data-src=&#8221;https:\/\/user-gold-cdn.xitu.io\/2019\/4\/25\/16a54b2653b1893e?imageView2\/0\/w\/1280\/h\/960\/format\/webp\/ignore-error\/1&#8243; data-width=&#8221;989&#8243; data-height=&#8221;1280&#8243; \/><figcaption><\/figcaption><\/figure>\n<p>\u901a\u7528\u9009\u62e9\u5668\uff08*\uff09\uff0c\u7ec4\u5408\u7b26\uff08+\uff0c&gt;\uff0c\u301c\uff0c&#8221;\uff0c||\uff09\u548c\u5426\u5b9a\u4f2a\u7c7b\uff08\uff1anot\uff08\uff09\uff09\u5bf9\u6743\u91cd\u6ca1\u6709\u5f71\u54cd\u3002<\/p>\n<h4 class=\"heading\" data-id=\"heading-34\">5.\u8bf7\u95ee\u4e3a\u4f55\u8981\u4f7f\u7528translate()\u800c\u975eabsolute positioning\uff0c\u6216\u53cd\u4e4b\u7684\u7406\u7531\uff1f\u4e3a\u4ec0\u4e48\uff1f<\/h4>\n<p><strong>1 year before<\/strong> absolute<\/p>\n<ul>\n<li>\u4ece\u6b63\u5e38\u6587\u6863\u6d41\u79fb\u9664<\/li>\n<li>\u4e0d\u5360\u636e\u9875\u9762\u5e03\u5c40\u7a7a\u95f4<\/li>\n<li>\u5f00\u8f9f\u65b0\u7684stacking context<\/li>\n<li>\u5f71\u54cd\u5176\u4ed6\u5e03\u5c40\u5143\u7d20<\/li>\n<li>\u6d88\u9664\u8fb9\u7f18\u91cd\u53e0<\/li>\n<\/ul>\n<p>\u51cf\u5c11\u4e86\u8ba1\u7b97\uff0ctranslate()\u4e0d\u5f71\u54cd\u5176\u4ed6\u5143\u7d20\uff0c\u6027\u80fd\u66f4\u597d\uff0cGPU\u8ba1\u7b97\u6b21\u6570\u66f4\u5c11<\/p>\n<p><strong>today<\/strong> \u5728\u6211\u7684\u8fd9\u7bc7\u535a\u95ee\u4e2d\u6709\u7b54\u6848\uff1a<a href=\"https:\/\/segmentfault.com\/a\/1190000013045035\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">CSS3\u52a8\u753b\u5361\u987f\u6027\u80fd\u4f18\u5316\u89e3\u51b3\u65b9\u6848<\/a><\/p>\n<p>translate()\u6d89\u53ca\u5230\u7684\u662f\u5408\u6210\u5668\u7ebf\u7a0b\uff0c\u4e0e\u4e3b\u7ebf\u7a0b\u662f\u76f8\u4e92\u72ec\u7acb\u7684\uff0c\u6240\u4ee5\u4f1a\u6bd4\u8f83\u5feb\u3002 \u800cabsolute positioning\u6d89\u53ca\u5230\u7684\u662f\u4e3b\u7ebf\u7a0b\uff0c\u4f1a\u5bfc\u81f4\u4e3b\u7ebf\u7a0b\u8d1f\u8d23\u7684\u5e03\u5c40\u91cd\u7ed8\u548cjs\u6267\u884c\uff0c\u6240\u4ee5\u4f1a\u6bd4\u8f83\u6162\u3002<\/p>\n<h3 class=\"heading\" data-id=\"heading-35\">JS<\/h3>\n<h4 class=\"heading\" data-id=\"heading-36\">1..call\u548c.apply\u7684\u533a\u522b\u662f\u4ec0\u4e48\uff1f<\/h4>\n<p><strong>1 year before<\/strong><\/p>\n<ul>\n<li>\u4f20\u5165\u53c2\u6570\u65b9\u5f0f\u4e0d\u540c\uff0c\u4f46\u90fd\u662f\u52a8\u6001\u4fee\u6539this\u4e0a\u4e0b\u6587<\/li>\n<li>call \u4f1a\u6709\u51fd\u6570\u6267\u884c\u6808\u7684\u64cd\u4f5c<\/li>\n<li>apply\u4ec5\u4ec5\u5c06arguments\u4f20\u5230\u65b0\u7684\u7c7b\u4e2d<\/li>\n<\/ul>\n<p><strong>today<\/strong> \u5173\u4e8e\u8fd9\u4e2a\u95ee\u9898\u66fe\u7ecf\u4ea7\u51fa2\u7bc7\u535a\u5ba2\uff1a <a href=\"https:\/\/segmentfault.com\/a\/1190000012563714\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">\u4ece\u89c4\u8303\u53bb\u770bFunction.prototype.apply\u5230\u5e95\u662f\u600e\u4e48\u5de5\u4f5c\u7684\uff1f<\/a> <a href=\"https:\/\/segmentfault.com\/a\/1190000014763029\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">\u4ece\u89c4\u8303\u53bb\u770bFunction.prototype.call\u5230\u5e95\u662f\u600e\u4e48\u5de5\u4f5c\u7684\uff1f<\/a> <strong>call\u662f\u7d22\u53d6\uff0capply\u662f\u4ed8\u51fa\u3002<\/strong> \u4ececall\u548capply\u7684\u5b57\u9762\u610f\u601d\u5c31\u53ef\u4ee5\u770b\u51fa\uff0ccall\u8c03\u7528\uff0capply\u5e94\u7528\uff0c\u8c03\u7528\u51fd\u6570\uff0c\u5e94\u7528\u53c2\u6570\u3002 call\u548capply\u7684\u4e3b\u8981\u533a\u522b\u5728\u4e8e\uff0ccall\u4ec5\u4ec5\u5207\u6362this\u4e0a\u4e0b\u6587\u5230\u5176\u4ed6\u7c7b\uff0c\u4ece\u800c\u8c03\u7528\u81ea\u5df1\u4e0d\u5b58\u5728\u7684\u65b9\u6cd5\uff1b\u800capply\u4e3b\u8981\u662f\u4e3a\u4e86\u5c06\u5176\u4ed6\u7c7b\u578b\u7684\u53c2\u6570\u4f20\u9012\u5230\u81ea\u5df1\u5185\u90e8\uff0c\u518d\u8c03\u7528\u81ea\u5df1\u7684\u65b9\u6cd5\u3002<\/p>\n<p>\u5047\u8bbe\u6709foo\uff0cbar\u3002 <code>foo.call(bar)<\/code> bar\u8c03\u7528foo\u7684\u65b9\u6cd5\uff0c\u5b9e\u4f8bObject.toString([1,2,3])-&gt;&#8221;[object Array]&#8221;,\u6570\u7ec4\u5b9e\u4f8b\u8c03\u7528\u4e86Object\u7c7b\u7684toString\u65b9\u6cd5\u3002 <code>foo.apply(null, bar)<\/code> foo\u7684\u65b9\u6cd5\u5e94\u7528bar\u7684\u53c2\u6570\uff0cMath.max.apply(null, [1,2,3])-&gt;3\uff0cMath\u7684max\u65b9\u6cd5\u5e94\u7528\u4e86[1,2,3]\u4e2d\u7684\u6bcf\u4e2a\u53c2\u6570\u3002<\/p>\n<h4 class=\"heading\" data-id=\"heading-37\">2.\u8bf7\u89e3\u91caJSONP\u7684\u5de5\u4f5c\u539f\u7406\uff0c\u4ee5\u53ca\u5b83\u4e3a\u4ec0\u4e48\u4e0d\u662f\u771f\u6b63\u7684Ajax\uff1f<\/h4>\n<p><strong>1 year before<\/strong> JSONP \u539f\u7406\uff1a\u5f02\u6b65\u63d2\u5165\u4e00\u4e2a<code>&lt;script&gt;&lt;\/script&gt;<\/code>\uff0c\u4f1a\u6709XSS\u95ee\u9898 \u539f\u56e0\uff1a\u6ca1\u6709\u8c03\u7528XMR\u5bf9\u8c61 <strong>today<\/strong> \u4e00\u79cd\u6bd4\u8f83\u53e4\u8001\u7684\u4e0d\u5b89\u5168\u7684\u8de8\u57df\u8bf7\u6c42\u8bbf\u95ee\u65b9\u5f0f\uff0c\u6ca1\u6709\u8c03\u7528XMR\u5bf9\u8c61\uff0c\u670d\u52a1\u5668\u5141\u8bb8\u6d4f\u89c8\u5668\u5728query parameter\u4e2d\u4f20\u9012\u6d4f\u89c8\u5668\u5185\u5b9a\u4e49\u7684\u51fd\u6570\uff0c\u800c\u8fd9\u4e2a\u51fd\u6570\u662f\u6709\u6982\u7387\u88abXSS\u653b\u51fb\u6539\u5199\u7684\u3002<\/p>\n<p>\u6765\u81eaStackOverflow\u9ad8\u7968\u7b54\u6848\uff1a<a href=\"https:\/\/stackoverflow.com\/questions\/2067472\/what-is-jsonp-and-why-was-it-created\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">stackoverflow.com\/questions\/2\u2026<\/a><\/p>\n<p>JSONP\u4e0d\u662f\u4e00\u4e2a\u5f88\u590d\u6742\u7684\u95ee\u9898\u3002 \u5047\u8bbe\u6211\u4eec\u5728<code>example.com<\/code>\u57df\u540d\u4e0b\uff0c\u6b64\u65f6\u6211\u4eec\u60f3\u7ed9<code>example.net<\/code>\u57df\u540d\u53d1\u9001\u4e00\u4e2a\u8bf7\u6c42\u3002\b\u4e3a\u4e86\u8bf7\u6c42\u6210\u529f\uff0c\u9700\u8981\u8de8\u8d8a\u57df\u540d\u8fb9\u754c\uff0c\u8fd9\u5bf9\u4e8e\u6d4f\u89c8\u5668\u6765\u8bf4\u662f\u7981\u5fcc\u3002<\/p>\n<p>\u7ed5\u5f00\u8fd9\u4e2a\u9650\u5236\u7684\u4e00\u79cd\u65b9\u5f0f\u662f<code>&lt;script&gt;<\/code>\u6807\u7b7e\u3002\u5f53\u4f60\u4f7f\u7528script\u6807\u7b7e\u7684\u65f6\u5019\uff0c\u57df\u540d\u9650\u5236\u4f1a\u88ab\u5ffd\u7565\uff0c\u4f46\u662f\u5bf9\u7ed3\u679c\u4e0d\u80fd\u505a\u4efb\u4f55\u5904\u7406\uff0c\u811a\u672c\u662f\u88ab\u8bc4\u4f30\u8fc7\u7684\u3002<\/p>\n<p>\u5f00\u59cb\u8fdb\u5165JSONP\u3002\u5f53\u4f60\u53d1\u9001\u4e00\u4e2a\u8bf7\u6c42\u5230\u652f\u6301JSONP\u7684\u670d\u52a1\u5668\uff0c\u4f60\u4f1a\u4f20\u4e00\u4e9b\u7279\u6b8a\u7684\u5173\u4e8e\u4f60\u7684\u9875\u9762\u7684\u6570\u636e\u7ed9\u670d\u52a1\u5668\u3002\u8fd9\u79cd\u65b9\u5f0f\u4e0b\uff0c\u670d\u52a1\u5668\u4f1a\u4ee5\u4f60\u7684\u6d4f\u89c8\u5668\u5904\u7406\u8d77\u6765\u65b9\u4fbf\u7684\u65b9\u5f0f\u5305\u88c5\u54cd\u5e94\u3002<\/p>\n<p>\u4f8b\u5982\uff0c\u670d\u52a1\u5668\u9700\u8981\u4e00\u4e2a\u53eb\u505acallback\u7684\u53c2\u6570\u53bb\u5f00\u542fJSONP\u529f\u80fd\u3002\u7136\u540e\u4f60\u7684\u8bf7\u6c42\u4f1a\u60f3\u4e0b\u9762\u8fd9\u6837\uff1a <code>http:\/\/www.example.net\/sample.aspx?callback=mycallback<\/code><\/p>\n<p>\u6ca1\u6709JSONP\u7684\u60c5\u51b5\u4e0b\uff0c\u8fd9\u53ef\u4ee5\u8fd4\u56de\u4e00\u4e9b\u57fa\u672c\u7684JS\u5bf9\u8c61\uff0c\u4f8b\u5982\uff1a <code>{foo: 'bar'}<\/code><\/p>\n<p>\u7136\u800c\uff0c\u5728\u652f\u6301JSONP\u7684\u60c5\u51b5\u4e0b\uff0c\u670d\u52a1\u5668\u63a5\u6536\u5230callback\u53c2\u6570\uff0c\u5b83\u5305\u88f9\u7ed3\u679c\u7684\u65b9\u5f0f\u662f\u4e0d\u4e00\u6837\u7684\uff0c\u4f1a\u8fd4\u56de\u4e0b\u9762\u8fd9\u6837\u7684\u6570\u636e\uff1a <code>mycallback({foo: 'bar'});<\/code><\/p>\n<p>\u5c31\u5982\u4f60\u7f29\u51cf\uff0c\u4ed6\u4f1a\u8c03\u7528\u6d4f\u89c8\u5668\u7aef\u7684\u65b9\u6cd5\u3002\u6240\u4ee5\uff0c\u5728\u4f60\u7684\u9875\u9762\u4e0acallback\u7684\u5b9a\u4e49\u5982\u4e0b\uff1a<\/p>\n<pre><code class=\"hljs js copyable\" lang=\"js\">mycallback = <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span>(<span class=\"hljs-params\">data<\/span>)<\/span>{\r\n  alert(data.foo);\r\n};\r\n<span class=\"copy-code-btn\">\u590d\u5236\u4ee3\u7801<\/span><\/code><\/pre>\n<p>\u73b0\u5728\u7684\u8bdd\uff0c\u5728\u811a\u672c\u52a0\u8f7d\u6210\u529f\u540e\uff0c\u5b83\u4f1a\u88ab\u8bc4\u4f30\uff0c\u7136\u540e\u51fd\u6570\u6267\u884c\u3002cross-domain\u8bf7\u6c42\u6210\u529f\uff01<\/p>\n<p>\u6240\u4ee5JSONP\u5b58\u5728\u4e00\u4e2a\u5f88\u4e25\u91cd\u7684\u95ee\u9898\uff1a\u4f60\u5931\u53bb\u4e86\u5bf9\u8bf7\u6c42\u7684\u63a7\u5236\u3002\u4f8b\u5982\uff0c\u65e0\u6cd5\u5f97\u77e5\u9519\u8bef\u4ee3\u7801\u7684\u8fd4\u56de\u3002\u53ef\u4ee5\u4f7f\u7528\u5b9a\u65f6\u5668\u53bb\u76d1\u63a7\u8bf7\u6c42\uff0c\u4f46\u662f\u8fd9\u4e0d\u662f\u5f88\u597d\u3002JSONRequest\u662f\u4e00\u4e2a\u975e\u5e38\u597d\u7684\u8de8\u57df\u811a\u672c\u6267\u884c\u7684\u65b9\u5f0f\uff0c\u5b89\u5168\uff0c\u5e76\u4e14\u83b7\u5f97\u66f4\u591a\u5bf9\u8bf7\u6c42\u7684\u63a7\u5236\u3002<\/p>\n<p>2015\u5e74\uff0cCORS\u662f\u4e00\u4e2a\u4e0eJSONRequest\u53ef\u4ee5\u6297\u8861\u7684\u65b9\u6848\u3002JSONP\u5728\u8001\u5f0f\u6d4f\u89c8\u5668\u4e0b\u4ecd\u65e7\u6709\u7528\uff0c\u4f46\u662f\u4e0d\u5b89\u5168\u3002 CORS\u662f\u505a\u8de8\u57df\u8bf7\u6c42\u8bbf\u95ee\u7684\u66f4\u5b89\u5168\u3001\u66f4\u9ad8\u6548\u7684\u4e00\u79cd\u65b9\u5f0f\u3002<\/p>\n<h4 class=\"heading\" data-id=\"heading-38\">3.\u7528\u8fc7javascript\u6a21\u677f\u7cfb\u7edf\u5417\uff1f\u90fd\u4f7f\u7528\u8fc7\u54ea\u4e9b\u5e93\uff1f<\/h4>\n<p><strong>1 year before<\/strong> jade vue angular react <code>{ ... }<\/code>\u6216\u8005<code>{{ ... }}<\/code><\/p>\n<p><strong>today:<\/strong> <a href=\"https:\/\/github.com\/FrankKai\/FrankKai.github.io\/issues\/143\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">\u4e00\u4e9b\u597d\u7528\u7684\u6a21\u677f\u5f15\u64ce\u5e93<\/a><\/p>\n<p>\u5e38\u7528\u7684\u8fd8\u662f\u524d\u7aef\u6846\u67b6\u81ea\u5e26\u7684\u4ee5\u53capug\uff0c\u7531\u4e8e\u6211\u53ea\u5bf9vue.js\u7684\u6bd4\u8f83\u719f\u6089\u6240\u4ee5\u5c31\u6ca1\u6709\u7f57\u5217react\u548cangular\u7684demo\u3002<\/p>\n<h4 class=\"heading\" data-id=\"heading-39\">4.== \u548c === \u6709\u4ec0\u4e48\u4e0d\u540c\uff1f<\/h4>\n<p><strong>1 year before<\/strong> \u8fd9\u4e2a\u95ee\u9898\u5199\u8fc7\u535a\u5ba2\uff0c\u770b\u8fc7\u89c4\u8303\u3002 \u2460===\u662f==\u7684\u5b50\u96c6 \u2461==\u6709\u7c7b\u578b\u8f6c\u6362 \u2462\u89c4\u8303\u5185\u5b9e\u73b0\u673a\u5236\u4e0d\u540c <strong>today<\/strong> <a href=\"https:\/\/segmentfault.com\/a\/1190000011658459\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">\u4f60\u771f\u7684\u7406\u89e3==\u548c===\u7684\u533a\u522b\u5417\uff1f<\/a><\/p>\n<h4 class=\"heading\" data-id=\"heading-40\">5.\u8bf7\u89e3\u91caJavascript\u7684\u540c\u6e90\u7b56\u7565(same-origin policy)<\/h4>\n<p><strong>1 year before<\/strong> \u6d4f\u89c8\u5668\u5b89\u5168\u673a\u5236<\/p>\n<ul>\n<li>same-origin\uff1a\u76f8\u540c\u534f\u8bae\uff0c\u76f8\u540chost\uff0c\u76f8\u540c\u7aef\u53e3<\/li>\n<li>\u8de8\u57df\u95ee\u9898\uff1aCORS \u53ef\u4ee5\u540e\u7aef\u8bbe\u7f6e\u5141\u8bb8 cross-origin-access\u4fe1\u606f<\/li>\n<\/ul>\n<p><strong>today<\/strong> <a href=\"https:\/\/github.com\/FrankKai\/FrankKai.github.io\/issues\/144\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">\u5982\u4f55\u7406\u89e3same-origin policy\uff1f<\/a><\/p>\n<h4 class=\"heading\" data-id=\"heading-41\">6.\u4f60\u4f7f\u7528\u8fc7Promises\u53ca\u5176polyfills\u5417\uff1f\u8bf7\u5199\u51faPromise\u7684\u57fa\u672c\u7528\u6cd5\uff08ES6\uff09<\/h4>\n<p><strong>1 year before<\/strong> axios<\/p>\n<ul>\n<li>axios get() post()<\/li>\n<li>\u524d\u7aef\u8bf7\u6c42\u3001\u54cd\u5e94\u62e6\u622a\u5668<\/li>\n<\/ul>\n<p><strong>today<\/strong><\/p>\n<ul>\n<li>Promise.all() \u53ea\u6709\u5f53\u6240\u6709\u7684\u5f02\u6b65Promise\u6267\u884c\u5b8c\u4e3aresolved\u72b6\u6001\u65f6\uff0c\u8fd4\u56de\u4e00\u4e2aPromise<\/li>\n<li>Promise.prototype.catch() \u6355\u6349Promise\u6267\u884c\u8fc7\u7a0b\u4e2d\u6355\u6349\u5230\u7684\u5f02\u5e38<\/li>\n<li>Promise.prototype.finally() \u662fcatch\u548cthen\u7684\u5e76\u96c6\uff0c\u5e38\u7528\u4e8e\u5728catch\u548cthen\u4e2d\u90fd\u8fd0\u884c\u7684\u4ee3\u7801\uff0c\u907f\u514d\u91cd\u590d<\/li>\n<li>Promise.prototype.then() Promise\u6267\u884c\u5b8c\u6bd5\uff0c\u8fdb\u884c\u4e0b\u4e00\u6b65<\/li>\n<li>Promise.race() Promise\u7ade\u4e89\uff0c\u8fd4\u56dePromise\u96c6\u5408\u4e2d\u6700\u5148resolve\u6216\u8005reject\u51fa\u6765\u7684Promise\uff1b\u5e38\u7528\u4e8e\u65f6\u95f4\u63a7\u5236\u3001\u4e2d\u6b62Promise \u53ef\u4ee5\u53c2\u8003\u6211\u53d1\u7684\u4e00\u7bc7\u5e16\u5b50\uff1a<a href=\"https:\/\/www.v2ex.com\/t\/559596#reply6\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">\u4ec0\u4e48\u60c5\u51b5\u4e0b\u4f1a\u7528 Promise.race()?<\/a><\/li>\n<li>Promise.reject() Promise\u7c7b\u6355\u6349\u5f02\u5e38<\/li>\n<li>Promise.resolve() Promise\u7c7b\u89e3\u6790\u6570\u636e<\/li>\n<\/ul>\n<h4 class=\"heading\" data-id=\"heading-42\">7.\u4f7f\u7528Promises\u800c\u975e\u56de\u8c03\uff08callbacks\uff09\u4f18\u7f3a\u70b9\u662f\u4ec0\u4e48\uff1f<\/h4>\n<p><strong>1 year before<\/strong> \u89e3\u51b3\u4e86callback hell\u95ee\u9898\u3002<\/p>\n<p><strong>today<\/strong> \u4ee5\u4e00\u4e2a\u56fe\u7247\u8d44\u6e90\u52a0\u8f7d\u7ed8\u5236canvas\u3002<\/p>\n<pre><code class=\"hljs js copyable\" lang=\"js\"><span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">CanvasImage<\/span> <\/span>{\r\n  <span class=\"hljs-keyword\">constructor<\/span>(url, width, height) {\r\n    <span class=\"hljs-keyword\">this<\/span>.width = width || <span class=\"hljs-number\">500<\/span>;\r\n    <span class=\"hljs-keyword\">this<\/span>.height = height || <span class=\"hljs-number\">500<\/span>;\r\n    <span class=\"hljs-keyword\">this<\/span>.url = url || <span class=\"hljs-string\">''<\/span>;\r\n\r\n    <span class=\"hljs-keyword\">this<\/span>.element = <span class=\"hljs-keyword\">new<\/span> Image(<span class=\"hljs-keyword\">this<\/span>.width, <span class=\"hljs-keyword\">this<\/span>.height);\r\n  }\r\n  get imageElement() {\r\n    <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">this<\/span>.element;\r\n  }\r\n}\r\n<span class=\"copy-code-btn\">\u590d\u5236\u4ee3\u7801<\/span><\/code><\/pre>\n<p>callback hell\u65b9\u5f0f<\/p>\n<pre><code class=\"hljs js copyable\" lang=\"js\">source.onload = <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span>() <\/span>{\r\n  <span class=\"hljs-keyword\">const<\/span> target = <span class=\"hljs-keyword\">new<\/span> CanvasImage(url, <span class=\"hljs-number\">80<\/span>, <span class=\"hljs-number\">80<\/span>).imageElement;\r\n  target.onload = <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span>() <\/span>{\r\n    <span class=\"hljs-keyword\">const<\/span> main = <span class=\"hljs-keyword\">new<\/span> MainCanvas(source, target, <span class=\"hljs-string\">'right'<\/span>).canvasElement;\r\n    context.drawImage(main, <span class=\"hljs-number\">0<\/span>, <span class=\"hljs-number\">0<\/span>, <span class=\"hljs-number\">500<\/span>, <span class=\"hljs-number\">500<\/span>);\r\n  };\r\n};\r\n<span class=\"copy-code-btn\">\u590d\u5236\u4ee3\u7801<\/span><\/code><\/pre>\n<p>Promise\u65b9\u5f0f<\/p>\n<pre><code class=\"hljs js copyable\" lang=\"js\"><span class=\"hljs-keyword\">const<\/span> sourcePromise = <span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-built_in\">Promise<\/span>(<span class=\"hljs-function\">(<span class=\"hljs-params\">resolve<\/span>) =&gt;<\/span> {\r\n  setTimeout(<span class=\"hljs-function\"><span class=\"hljs-params\">()<\/span> =&gt;<\/span> {\r\n    <span class=\"hljs-keyword\">const<\/span> target = <span class=\"hljs-keyword\">new<\/span> CanvasImage(url, <span class=\"hljs-number\">80<\/span>, <span class=\"hljs-number\">80<\/span>).imageElement;\r\n    resolve(target);\r\n  }, <span class=\"hljs-number\">0<\/span>);\r\n});\r\nsource.onload = <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span>() <\/span>{\r\n  sourcePromise.then(<span class=\"hljs-function\">(<span class=\"hljs-params\">target<\/span>) =&gt;<\/span> {\r\n    <span class=\"hljs-keyword\">const<\/span> main = <span class=\"hljs-keyword\">new<\/span> MainCanvas(source, target, <span class=\"hljs-string\">'right'<\/span>).canvasElement;\r\n    context.drawImage(main, <span class=\"hljs-number\">0<\/span>, <span class=\"hljs-number\">0<\/span>, <span class=\"hljs-number\">500<\/span>, <span class=\"hljs-number\">500<\/span>);\r\n  });\r\n};\r\n<span class=\"copy-code-btn\">\u590d\u5236\u4ee3\u7801<\/span><\/code><\/pre>\n<p>async\/await\u65b9\u5f0f<\/p>\n<pre><code class=\"hljs js copyable\" lang=\"js\"> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">sourceCanvasImage<\/span>() <\/span>{\r\n  <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-built_in\">Promise<\/span>(<span class=\"hljs-function\">(<span class=\"hljs-params\">resolve<\/span>) =&gt;<\/span> {\r\n    setTimeout(<span class=\"hljs-function\"><span class=\"hljs-params\">()<\/span> =&gt;<\/span> {\r\n      <span class=\"hljs-keyword\">const<\/span> target = <span class=\"hljs-keyword\">new<\/span> CanvasImage(url, <span class=\"hljs-number\">80<\/span>, <span class=\"hljs-number\">80<\/span>).imageElement;\r\n      resolve(target);\r\n    }, <span class=\"hljs-number\">0<\/span>);\r\n  });\r\n}\r\n\r\n<span class=\"hljs-keyword\">async<\/span> <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">mergeCanvas<\/span>() <\/span>{\r\n  <span class=\"hljs-keyword\">const<\/span> targetElement = <span class=\"hljs-keyword\">await<\/span> sourceCanvasImage();\r\n  <span class=\"hljs-keyword\">const<\/span> main = <span class=\"hljs-keyword\">new<\/span> MainCanvas(source, targetElement, <span class=\"hljs-string\">'right'<\/span>).canvasElement;\r\n  context.drawImage(main, <span class=\"hljs-number\">0<\/span>, <span class=\"hljs-number\">0<\/span>, <span class=\"hljs-number\">500<\/span>, <span class=\"hljs-number\">500<\/span>);\r\n}\r\n\r\nsource.onload = <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span>() <\/span>{\r\n  mergeCanvas();\r\n};\r\n<span class=\"copy-code-btn\">\u590d\u5236\u4ee3\u7801<\/span><\/code><\/pre>\n<h4 class=\"heading\" data-id=\"heading-43\">8.\u4ec0\u4e48\u662f\u4e8b\u4ef6\u5faa\u73af\uff08event loop\uff09\uff1f<\/h4>\n<p><strong>1 year before<\/strong><\/p>\n<ul>\n<li>\u5f02\u6b65\u539f\u7406<\/li>\n<li>\u4e8b\u4ef6\u8ba2\u9605\u3001\u4e8b\u4ef6\u53d1\u5e03<\/li>\n<li>\u5f02\u6b65\u975e\u963b\u585e\u5f0f\u4e8b\u4ef6<\/li>\n<\/ul>\n<p><strong>today<\/strong> \u5b98\u65b9\u7684\u89e3\u91ca\u66f4\u52a0\u6743\u5a01\uff1a<a href=\"https:\/\/nodejs.org\/de\/docs\/guides\/event-loop-timers-and-nexttick\/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">nodejs.org\/de\/docs\/gui\u2026<\/a><\/p>\n<blockquote><p>\u4ec0\u4e48\u662fEvent Loop\uff1fevent loop\u5141\u8bb8Node.js\u6267\u884c\u975e\u963b\u585e\u7684I\/O\u64cd\u4f5c&#8212;&#8211;\u5c3d\u7ba1JS\u662f\u5355\u7ebf\u7a0b\u7684&#8212;&#8211;\u5b83\u5c3d\u53ef\u80fd\u5730\u901a\u8fc7\u628a\u64cd\u4f5c\u5378\u8f7d\u5230\u7cfb\u7edf\u5185\u6838\uff08kernel\uff09\u3002<\/p><\/blockquote>\n<p>\u56e0\u4e3a\u5927\u591a\u6570\u73b0\u4ee3\u7684\u5185\u6838\uff08kernel\uff09\u662f\u591a\u7ebf\u7a0b\u7684\uff0c\u5b83\u4eec\u53ef\u4ee5\u5728\u540e\u53f0\u5904\u7406\u591a\u4e2a\u64cd\u4f5c\u3002\u5f53\u5176\u4e2d\u4e4b\u4e00\u5b8c\u6210\u540e\uff0ckernel\u4f1a\u544a\u8bc9Node.js\u4e00\u4e2a\u9002\u5f53\u7684callback\u53ef\u4ee5\u88ab\u6dfb\u52a0\u5230<strong>poll queue<\/strong>\uff08\u8f6e\u8be2\u961f\u5217\uff09\u4e2d\u5e76\u4e14\u6267\u884c\u3002<\/p>\n<p>\u66f4\u591a\u539f\u7406\u4e0a\u7684\u5185\u5bb9\uff0c\u53ef\u4ee5\u53c2\u8003\uff1a<a href=\"https:\/\/github.com\/FrankKai\/FrankKai.github.io\/issues\/145\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">[\u8bd1]Node.js Event Loop\uff0cTimers\u548c process.nextTick()<\/a><\/p>\n<p>event loop\uff0c\u539f\u7406\u7ec6\u8282\u5305\u62ec\u4ee5\u4e0b\u5185\u5bb9<\/p>\n<ul>\n<li>call stack<\/li>\n<li>(macro)task queue<\/li>\n<li>microTask queue<\/li>\n<li>background thread<\/li>\n<\/ul>\n<p>\u5176\u4e2d\u524d\u4e09\u90e8\u5206\u5c5e\u4e8emain thread\uff0c\u53ef\u4ee5\u9605\u8bfbnode\u6e90\u7801\u4e00\u63a2\u7a76\u7adf\u3002\u6700\u540e\u7684background thread\u5c5e\u4e8elibuv\u7684\u90e8\u5206\uff0c\u53ef\u4ee5\u53bb\u6df1\u5165libuv\u6e90\u7801(\u8fd9\u662f\u4e00\u4e2a\u4e13\u95e8\u5904\u7406\u5f02\u6b65\u7684c\u8bed\u8a00\u5e93)\u7406\u89e3\u5176\u5b9e\u73b0\u673a\u5236\u3002<\/p>\n<p>\u4f46\u662f\u9605\u8bfb\u6e90\u7801\u9700\u8981\u975e\u5e38\u597d\u7684\u57fa\u7840\u3002\u8fd9\u91cc\u63a8\u8350\u4e00\u7bc7\u56ca\u62ec\u4e86\u4ee5\u4e0a\u77e5\u8bc6\u70b9\u7684\u975e\u5e38\u8d70\u5fc3\u7684\u6587\u7ae0\uff1a<a href=\"https:\/\/blog.risingstack.com\/node-js-at-scale-understanding-node-js-event-loop\/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">blog.risingstack.com\/node-js-at-\u2026<\/a><\/p>\n<h3 class=\"heading\" data-id=\"heading-44\">\u4ee3\u7801<\/h3>\n<h4 class=\"heading\" data-id=\"heading-45\">1.foo\u7684\u503c\u662f\u4ec0\u4e48\uff1f<\/h4>\n<p><code>var foo = 10 + '20';<\/code><\/p>\n<p><strong>1 year before:<\/strong> 30<\/p>\n<p><strong>today:<\/strong> &#8220;1020&#8221;<\/p>\n<h4 class=\"heading\" data-id=\"heading-46\">2.\u5982\u4f55\u5b9e\u73b0\u4ee5\u4e0b\u51fd\u6570\uff1f<\/h4>\n<pre><code class=\"hljs js copyable\" lang=\"js\">add(<span class=\"hljs-number\">2<\/span>, <span class=\"hljs-number\">5<\/span>);<span class=\"hljs-comment\">\/\/ 7<\/span>\r\nadd(<span class=\"hljs-number\">2<\/span>)(<span class=\"hljs-number\">5<\/span>);<span class=\"hljs-comment\">\/\/ 7<\/span>\r\n<span class=\"copy-code-btn\">\u590d\u5236\u4ee3\u7801<\/span><\/code><\/pre>\n<p><strong>1 year before<\/strong> \u901a\u8fc7arguments\u7c7b\u6570\u7ec4\u5bf9\u8c61\u3002<\/p>\n<pre><code class=\"hljs js copyable\" lang=\"js\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">foo<\/span>()<\/span>{\r\n    <span class=\"hljs-keyword\">var<\/span> sum = <span class=\"hljs-number\">0<\/span>;\r\n    <span class=\"hljs-keyword\">for<\/span>(<span class=\"hljs-keyword\">var<\/span> i = <span class=\"hljs-number\">0<\/span>; i&lt;<span class=\"hljs-built_in\">arguments<\/span>.length; i++){\r\n        sum += <span class=\"hljs-built_in\">arguments<\/span>[i]\r\n    }\r\n    <span class=\"hljs-keyword\">if<\/span>(<span class=\"hljs-built_in\">arguments<\/span>.length&gt;=<span class=\"hljs-number\">2<\/span>){\r\n        <span class=\"hljs-keyword\">return<\/span> sum;\r\n    }<span class=\"hljs-keyword\">else<\/span>{\r\n        <span class=\"hljs-keyword\">return<\/span> foo;\r\n    }\r\n}\r\n<span class=\"copy-code-btn\">\u590d\u5236\u4ee3\u7801<\/span><\/code><\/pre>\n<p>add(2)(5)\u8fd0\u884c\u5931\u8d25\u3002<\/p>\n<p><strong>today<\/strong><\/p>\n<pre><code class=\"hljs js copyable\" lang=\"js\"><span class=\"hljs-keyword\">const<\/span> add = <span class=\"hljs-function\">(<span class=\"hljs-params\">a, b<\/span>) =&gt;<\/span> {\r\n    <span class=\"hljs-keyword\">const<\/span> result =\r\n      a &amp;&amp; b\r\n        ? a + b\r\n        : <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span>(<span class=\"hljs-params\">b<\/span>) <\/span>{\r\n            <span class=\"hljs-keyword\">return<\/span> a + b;\r\n          };\r\n    <span class=\"hljs-keyword\">return<\/span> result;\r\n };\r\n<span class=\"copy-code-btn\">\u590d\u5236\u4ee3\u7801<\/span><\/code><\/pre>\n<h4 class=\"heading\" data-id=\"heading-47\">3.\u4e0b\u9762\u4e24\u4e2aalert\u7684\u7ed3\u679c\u662f\u4ec0\u4e48\uff1f<\/h4>\n<pre><code class=\"hljs js copyable\" lang=\"js\"><span class=\"hljs-keyword\">var<\/span> foo = <span class=\"hljs-string\">\"Hello\"<\/span>;\r\n(<span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span>() <\/span>{\r\n    <span class=\"hljs-keyword\">var<\/span> bar = <span class=\"hljs-string\">\" world\"<\/span>;\r\n    alert(foo + bar);\r\n})();\r\nalert(foo + bar);\r\n<span class=\"copy-code-btn\">\u590d\u5236\u4ee3\u7801<\/span><\/code><\/pre>\n<p><strong>1 year before<\/strong> &#8220;undefined World&#8221; &#8220;Hello undefined&#8221;<\/p>\n<p><strong>today<\/strong> &#8220;Hello world&#8221; \/\/ \u7acb\u5373\u6267\u884c\u51fd\u6570\u4f5c\u7528\u57df\u53ef\u4ee5\u8bbf\u95ee\u5168\u5c40\u53d8\u91cf Uncaught ReferenceError: bar is not defined \/\/ \u5168\u5c40\u4f5c\u7528\u57df\u4e0d\u53ef\u4ee5\u8bbf\u95ee\u5c40\u90e8\u53d8\u91cf<\/p>\n<h4 class=\"heading\" data-id=\"heading-48\">4.\u4e0b\u9762\u4ee3\u7801\u7684\u8f93\u51fa\u662f\u4ec0\u4e48\uff1f<\/h4>\n<pre><code class=\"hljs js copyable\" lang=\"js\"><span class=\"hljs-built_in\">console<\/span>.log(<span class=\"hljs-string\">'one'<\/span>);\r\nsetTimeout(<span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span>() <\/span>{\r\n    <span class=\"hljs-built_in\">console<\/span>.log(<span class=\"hljs-string\">'two'<\/span>);\r\n}, <span class=\"hljs-number\">0<\/span>);\r\n<span class=\"hljs-built_in\">console<\/span>.log(<span class=\"hljs-string\">'three'<\/span>);\r\n<span class=\"copy-code-btn\">\u590d\u5236\u4ee3\u7801<\/span><\/code><\/pre>\n<p><strong>1 year before<\/strong> one three two<\/p>\n<p><strong>today<\/strong> one three two<\/p>\n<p>\u539f\u56e0\uff1a<strong>\u4f18\u5148\u6267\u884c\u51fd\u6570\u8c03\u7528\u6808\u4e2d\u4efb\u52a1\uff0csetTimeout\u6392\u5165\u5b8f\u4efb\u52a1\u961f\u5217\u5ef6\u540e\u6267\u884c\u3002<\/strong> event loop\u5305\u62eccall stack\uff0c(\u5b8f)\u4efb\u52a1\u961f\u5217\uff0c\u5fae\u4efb\u52a1\u961f\u5217\u548cbackground thread\uff0c\u800ccall stack\u4e2d\u7684\u666e\u901a\u4ee3\u7801\u4f18\u5148\u6267\u884c\uff0csetTimeout\u4f1a\u7ecf\u7531background thread\u8fdb\u5165\u5b8f\u4efb\u52a1\u961f\u5217\uff0c\u5b8f\u4efb\u52a1\u961f\u5217\u95f4\u9699\u6267\u884c\u5fae\u4efb\u52a1\u961f\u5217\u3002<\/p>\n<figure><img decoding=\"async\" class=\"lazyload inited\" src=\"data:;base64,<?xml version=\"1.0\"?><svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" version=\"1.1\" width=\"656\" height=\"704\"><\/svg>&#8221; alt=&#8221;image&#8221; data-src=&#8221;https:\/\/user-gold-cdn.xitu.io\/2019\/5\/2\/16a78a808040df20?imageView2\/0\/w\/1280\/h\/960\/format\/webp\/ignore-error\/1&#8243; data-width=&#8221;656&#8243; data-height=&#8221;704&#8243; \/><figcaption><\/figcaption><\/figure>\n<h4 class=\"heading\" data-id=\"heading-49\">5.\u4e0b\u9762\u4ee3\u7801\u7684\u8f93\u51fa\u662f\u4ec0\u4e48?<\/h4>\n<pre><code class=\"hljs js copyable\" lang=\"js\"><span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">getResult<\/span>(<span class=\"hljs-params\">value, time<\/span>)<\/span>{\r\n    <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-keyword\">new<\/span> <span class=\"hljs-built_in\">Promise<\/span>(<span class=\"hljs-function\">(<span class=\"hljs-params\">resolve<\/span>)=&gt;<\/span>{\r\n        setTimeout(<span class=\"hljs-function\"><span class=\"hljs-params\">()<\/span>=&gt;<\/span>{\r\n            <span class=\"hljs-built_in\">console<\/span>.log(value);\r\n            resolve();\r\n        }, time);\r\n    });\r\n}\r\n(<span class=\"hljs-keyword\">async<\/span> () =&gt; {\r\n    <span class=\"hljs-keyword\">const<\/span> a = getResult(<span class=\"hljs-number\">1<\/span>, <span class=\"hljs-number\">300<\/span>);\r\n    <span class=\"hljs-keyword\">const<\/span> b = getResult(<span class=\"hljs-number\">2<\/span>, <span class=\"hljs-number\">200<\/span>);\r\n\r\n    <span class=\"hljs-keyword\">await<\/span> a;\r\n    <span class=\"hljs-keyword\">await<\/span> b;\r\n})();\r\n<span class=\"hljs-function\">(<span class=\"hljs-params\"><span class=\"hljs-keyword\">async<\/span> (<\/span>) =&gt;<\/span> {\r\n    <span class=\"hljs-keyword\">await<\/span> getResult(<span class=\"hljs-number\">1<\/span>, <span class=\"hljs-number\">300<\/span>);\r\n    <span class=\"hljs-keyword\">await<\/span> getResult(<span class=\"hljs-number\">2<\/span>, <span class=\"hljs-number\">200<\/span>);\r\n})();\r\n<span class=\"copy-code-btn\">\u590d\u5236\u4ee3\u7801<\/span><\/code><\/pre>\n<p><strong>1 year before<\/strong> 1 2<\/p>\n<p><strong>today<\/strong> 2 1 1 2<\/p>\n<p>\u8fd9\u662f\u4e00\u9053\u8003\u5bdfasync\u7684\u9898\u76ee\uff1a<a href=\"https:\/\/github.com\/FrankKai\/FrankKai.github.io\/issues\/146\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">\u5982\u4f55\u7406\u89e3async\u51fd\u6570\uff1f<\/a><\/p>\n<h4 class=\"heading\" data-id=\"heading-50\">6.\u4e0b\u9762\u7684\u4ee3\u7801\u8f93\u51fa\u662f\u4ec0\u4e48\uff1f<\/h4>\n<pre><code class=\"hljs js copyable\" lang=\"js\"><span class=\"hljs-keyword\">var<\/span> obj = {\r\n    <span class=\"hljs-attr\">a<\/span>: <span class=\"hljs-number\">1<\/span>,\r\n    <span class=\"hljs-attr\">name<\/span>: <span class=\"hljs-string\">'world'<\/span>,\r\n    <span class=\"hljs-attr\">objSayName<\/span>: <span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span>(<span class=\"hljs-params\">fn<\/span>) <\/span>{\r\n         fn();\r\n    }\r\n}\r\n<span class=\"hljs-keyword\">var<\/span> name = <span class=\"hljs-string\">'hello'<\/span>;\r\n<span class=\"hljs-keyword\">var<\/span> arr = [<span class=\"hljs-number\">1<\/span>, <span class=\"hljs-number\">2<\/span>, <span class=\"hljs-number\">3<\/span>, <span class=\"hljs-number\">4<\/span>, <span class=\"hljs-number\">5<\/span>];\r\n\r\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">foo<\/span>(<span class=\"hljs-params\">o<\/span>) <\/span>{\r\n    <span class=\"hljs-keyword\">var<\/span> bar = arr || [<span class=\"hljs-number\">6<\/span>, <span class=\"hljs-number\">7<\/span>, <span class=\"hljs-number\">8<\/span>];\r\n    <span class=\"hljs-keyword\">var<\/span> arr = [<span class=\"hljs-number\">4<\/span>, <span class=\"hljs-number\">2<\/span>, <span class=\"hljs-number\">9<\/span>];\r\n    <span class=\"hljs-keyword\">var<\/span> baz = o;\r\n    baz.a = <span class=\"hljs-number\">2<\/span>;\r\n    <span class=\"hljs-built_in\">console<\/span>.log(bar, obj.a);\r\n}\r\n\r\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">function<\/span> <span class=\"hljs-title\">sayName<\/span>() <\/span>{\r\n    <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-built_in\">console<\/span>.log(<span class=\"hljs-keyword\">this<\/span>.name);\r\n}\r\n\r\nfoo(obj);\r\nobj.objSayName(sayName);\r\n<span class=\"copy-code-btn\">\u590d\u5236\u4ee3\u7801<\/span><\/code><\/pre>\n<p><strong>1 year later<\/strong> [4,2,9] 2 &#8216;hello&#8217;<\/p>\n<p><strong>today<\/strong> [6,7,8] 2 &#8216;hello&#8217;<\/p>\n<p>\u539f\u56e0\uff1a \u53d8\u91cf\u63d0\u5347\u3002<\/p>\n<pre><code class=\"hljs js copyable\" lang=\"js\"><span class=\"hljs-keyword\">var<\/span> bar,arr,baz;\r\nbar = arr || [<span class=\"hljs-number\">6<\/span>, <span class=\"hljs-number\">7<\/span>, <span class=\"hljs-number\">8<\/span>];<span class=\"hljs-comment\">\/\/ \u6b64\u65f6arr\u662fundefined\uff0c\u56e0\u6b64bar\u5f97\u5230\u4e86[6, 7, 8]\u8d4b\u503c<\/span>\r\narr = [<span class=\"hljs-number\">4<\/span>, <span class=\"hljs-number\">2<\/span>, <span class=\"hljs-number\">9<\/span>];\r\n<span class=\"copy-code-btn\">\u590d\u5236\u4ee3\u7801<\/span><\/code><\/pre>\n<p>baz\u83b7\u5f97\u4e86obj\u7684\u5f15\u7528\uff0c\u6240\u6709\u4fee\u6539baz\u76f8\u5f53\u4e8e\u4fee\u6539obj\uff0c\u6240\u4ee5\u6253\u5370\u51fa2.<\/p>\n<p>\u56e0\u4e3a\u95ed\u5305\uff0c\u5168\u5c40\u7684sayName\u51fd\u6570\u5185\u7684this\u6307\u5411\u5168\u5c40\uff0c\u6240\u4ee5\u662fhello\u3002<\/p>\n<p>\u6211\u60f3\u6210\u4e3a\u4e00\u4e2a\u5f88\u5389\u5bb3\u7684\u4eba\uff0c\u8ba9\u8fd9\u4e2a\u4e16\u754c\u56e0\u4e3a\u6709\u4e86\u6211\u800c\u6709\u4e00\u70b9\u70b9\u4e0d\u4e00\u6837\uff0c\u54ea\u6015\uff0c\u53ea\u6709\u4e00\u70b9\u70b9<\/p>\n<p><strong>\u8d34\u4e00\u4e0b\u81ea\u5df1\u7406\u60f3\u4e2d\u7684\u56e2\u961f\u7684\u5173\u6ce8\u70b9<\/strong><\/p>\n<p><strong>1.\u4e2a\u4eba\u524d\u7aef\u6280\u672f\u7684\u6210\u957f\u7a7a\u95f4<\/strong><\/p>\n<p>\u6bd4\u5982\u8d44\u6df1\u524d\u7aef\u5bf9\u521d\u7ea7\u524d\u7aef\u7684\u6307\u5bfc\uff0c\u524d\u7aef\u56e2\u961f\u6210\u5458\u95f4\u7684\u5b66\u4e60\u548c\u63d0\u5347\u7b49\u7b49 \u8fd9\u4e2a\u6700\u91cd\u8981\uff0c\u6211\u7684\u76ee\u6807\u662f2\u5e74\u65f6\u95f4\u6210\u4e3a\u57fa\u7840\u624e\u5b9e\uff0c\u6709\u72ec\u7acb\u524d\u7aef\u6280\u672f\u89c1\u89e3\u7684\u5f00\u53d1\u8005<\/p>\n<p><strong>2.\u516c\u53f8\u5bf9\u5458\u5de5\u6210\u957f\u548c\u8fdb\u6b65\u7684\u91cd\u89c6\u7a0b\u5ea6<\/strong><\/p>\n<p>\u4f8b\u5982\u65b0\u4eba\u57f9\u8bad\uff0c\u6280\u672f\u5206\u4eab\uff0c\u6280\u672f\u7ffb\u8bd1\u7b49\u7b49<\/p>\n<p><strong>3.\u516c\u53f8\u52a0\u73ed\u60c5\u51b5\u662f996\u8fd8\u662f10105\u6216\u8005\u662f\u6309\u7167\u9879\u76ee\u8fdb\u5ea6\u5b89\u6392\u7684<\/strong><\/p>\n<p>\u53ea\u8981\u662f\u4e00\u5e2e\u8ffd\u6c42\u524d\u7aef\u6781\u81f4\u7684\u4eba\uff0c996\u662f\u5b8c\u5168OK\u7684<\/p>\n<p><strong>4.\u5458\u5de5\u8865\u8d34\uff0c\u798f\u5229<\/strong><\/p>\n<p>\u4f8b\u5982\u8fc7\u8282\u8865\u8d34\uff0c\u5de5\u4f1a\u798f\u5229<\/p>\n<p><strong>5.\u7ee9\u6548\u8003\u6838\u548c\u5956\u91d1<\/strong><\/p>\n<p>\u4f8b\u5982\u7ee9\u6548\u8003\u6838\uff0c\u5e74\u7ec8\u5956\u91d1<\/p>\n<p>&nbsp;<\/p>\n<p><strong>\u5982\u4f55\u6210\u4e3a\u4e00\u540d\u5408\u683c\u7684\u9762\u8bd5\u5b98\uff1f<\/strong><\/p>\n<ul>\n<li>\u5b66\u4f1a\u503e\u542c \u65e0\u8bba\u9762\u8bd5\u8005\u6709\u591a\u5c11\u804c\u573a\u4e0a\u7684\u4e0d\u5982\u610f\u60f3\u548c\u4f60\u503e\u8bc9\uff0c\u90fd\u8981\u8010\u5fc3\u542c\u4ed6\u8bb2\u5b8c\uff0c\u4e0d\u8981\u6253\u65ad\u4ed6<\/li>\n<li>\u5b66\u4f1a\u5b9a\u4f4d \u6839\u636e\u9762\u8bd5\u8005\u7684\u5de5\u4f5c\u7ecf\u9a8c\u548c\u5de5\u4f5c\u573a\u666f\uff0c\u5bf9\u80fd\u529b\u8fdb\u884c\u7b80\u5355\u5b9a\u4f4d\uff0c\u867d\u7136\u8fd9\u5076\u5c14\u4f1a\u6709\u6240\u504f\u9887\uff0c\u4f46\u662f\u5bf9\u4e8e\u540e\u7eed\u63d0\u95ee\u4f1a\u6709\u5f88\u597d\u7684\u5e2e\u52a9<\/li>\n<li>\u5b66\u4f1a\u7406\u89e3 \u7406\u89e3\u9762\u8bd5\u8005\u60f3\u8981\u8868\u8fbe\u7684\u5bf9\u77e5\u8bc6\u70b9\u7684\u7406\u89e3\uff0c\u5373\u4f7f\u4ed6\u8bb2\u7684\u5f88\u6a21\u7cca\uff0c\u5c3d\u53ef\u80fd\u6355\u6349\u5176\u7406\u89e3\u7684\u90e8\u5206<\/li>\n<li>\u5b66\u4f1a\u5f15\u5bfc \u5f53\u9762\u8bd5\u8005\u9047\u5230\u4e00\u9053\u68d8\u624b\u7684\u9898\u76ee\u65f6\uff0c\u5982\u679c\u5bf9\u65b9\u903b\u8f91\u4e0d\u6e05\u695a\uff0c\u5b66\u4f1a\u5316\u7e41\u4e3a\u7b80\uff0c\u7531\u6d45\u5165\u6df1\u53bb\u505a\u5f15\u5bfc\uff1b\u5047\u8bbe\u5bf9\u65b9\u5bf9\u5f53\u524d\u7684\u9898\u76ee\u6e38\u5203\u6709\u4f59\uff0c\u5f15\u5bfc\u6df1\u5165\u539f\u7406\u6216\u8005\u662f\u6269\u5c55\u51fa\u5e94\u7528\u573a\u666f<\/li>\n<li>\u5b66\u4f1a\u6316\u6398 \u5b66\u4f1a\u6316\u6398\u51fa\u9762\u8bd5\u8005\u8eab\u4e0a\u7684\u95ea\u5149\u70b9\uff0c\u806a\u660e\uff0c\u6267\u7740\uff0c\u8fd9\u4e9b\u90fd\u662f\u975e\u5e38\u597d\u7684\u54c1\u8d28<\/li>\n<li>\u5b66\u4f1a\u5c0a\u91cd \u5f53\u9762\u8bd5\u8005\u6025\u4e8e\u60f3\u5f97\u77e5\u9762\u8bd5\u5b98\u7684\u8bc4\u4ef7\u65f6\uff0c\u65e0\u8bba\u4f60\u5bf9\u4ed6\u662f\u5426\u6ee1\u610f\uff0c\u90fd\u91c7\u53d6&#8221;\u5982\u679c\u6709\u65b0\u7684\u8fdb\u5c55\uff0c\u6211\u4eec\u540e\u7eed\u4f1a\u518d\u901a\u77e5\u4f60&#8221;\u7684\u65b9\u5f0f<\/li>\n<li>\u5b66\u4f1a\u6c89\u9ed8 \u5f53\u9762\u8bd5\u8005\u60f3\u5f97\u77e5\u4f60\u5bf9\u95ee\u9898\u7684\u770b\u6cd5\u65f6\uff0c\u4e0d\u8981\u505a\u592a\u6df1\u5c42\u6b21\u7684\u8bb2\u89e3\uff0c\u70b9\u5230\u4e3a\u6b62\uff0c\u56e0\u4e3a\u6709\u9650\u7684\u9762\u8bd5\u65f6\u95f4\u4e3b\u8981\u76ee\u7684\u662f\u4e3a\u4e86\u8003\u5bdf\u9762\u8bd5\u8005\u7684\u80fd\u529b<\/li>\n<\/ul>\n<\/div>\n<p>\u94fe\u63a5\uff1ahttps:\/\/juejin.im\/post\/5a718cd36fb9a01caa20d8a8<\/p>\n","protected":false},"excerpt":{"rendered":"<p>1.\u8bf4\u4e00\u4e0b\u4f60\u719f\u6089\u7684\u8bbe\u8ba1\u6a21\u5f0f 2.\u8bf4\u4e00\u4e0b\u4f60\u7406\u89e3\u7684\u6a21\u5757\u673a\u5236 3.MVVM\u539f\u7406 4.\u6700\u719f\u6089\u7684\u6846\u67b6\u8def\u7531\u673a\u5236 5.\u72b6\u6001\u7ba1 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"_links":{"self":[{"href":"https:\/\/adeqing.com\/index.php\/wp-json\/wp\/v2\/posts\/189"}],"collection":[{"href":"https:\/\/adeqing.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/adeqing.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/adeqing.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/adeqing.com\/index.php\/wp-json\/wp\/v2\/comments?post=189"}],"version-history":[{"count":1,"href":"https:\/\/adeqing.com\/index.php\/wp-json\/wp\/v2\/posts\/189\/revisions"}],"predecessor-version":[{"id":190,"href":"https:\/\/adeqing.com\/index.php\/wp-json\/wp\/v2\/posts\/189\/revisions\/190"}],"wp:attachment":[{"href":"https:\/\/adeqing.com\/index.php\/wp-json\/wp\/v2\/media?parent=189"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/adeqing.com\/index.php\/wp-json\/wp\/v2\/categories?post=189"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/adeqing.com\/index.php\/wp-json\/wp\/v2\/tags?post=189"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}