{"action":"opened","issue":{"url":"https://api.github.com/repos/newued/me/issues/4","repository_url":"https://api.github.com/repos/newued/me","labels_url":"https://api.github.com/repos/newued/me/issues/4/labels{/name}","comments_url":"https://api.github.com/repos/newued/me/issues/4/comments","events_url":"https://api.github.com/repos/newued/me/issues/4/events","html_url":"https://github.com/newued/me/issues/4","id":363869032,"node_id":"MDU6SXNzdWUzNjM4NjkwMzI=","number":4,"title":"javascript之 原型链/上下文环境/this指向/闭包问题理解","user":{"login":"newued","id":19658614,"node_id":"MDQ6VXNlcjE5NjU4NjE0","avatar_url":"https://avatars0.githubusercontent.com/u/19658614?v=4","gravatar_id":"","url":"https://api.github.com/users/newued","html_url":"https://github.com/newued","followers_url":"https://api.github.com/users/newued/followers","following_url":"https://api.github.com/users/newued/following{/other_user}","gists_url":"https://api.github.com/users/newued/gists{/gist_id}","starred_url":"https://api.github.com/users/newued/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/newued/subscriptions","organizations_url":"https://api.github.com/users/newued/orgs","repos_url":"https://api.github.com/users/newued/repos","events_url":"https://api.github.com/users/newued/events{/privacy}","received_events_url":"https://api.github.com/users/newued/received_events","type":"User","site_admin":false},"labels":[],"state":"open","locked":false,"assignee":null,"assignees":[],"milestone":null,"comments":0,"created_at":"2018-09-26T05:56:28Z","updated_at":"2018-09-26T05:56:28Z","closed_at":null,"author_association":"OWNER","body":"对象——若干属性的集合。对象里面的一切都是属性，对象是函数创建的，而函数却又是一种对象。\r\n##### 原型链：\r\n访问一个对象的属性时，先在基本属性中查找，如果没有，再沿着__proto__这条链向上找，这就是原型链。\r\n每个函数都有一个属性叫做prototype,这个prototype的属性值是一个对象（属性的集合）,默认的只有一个叫做constructor的属性，指向这个函数本身。\r\n\r\n######  判断一个变量是否是对象值类型（undefined, number, string, boolean）用typeof,引用类型用instanceof。\r\nInstanceof的判断队则是：沿着A的__proto__这条线来找，同时沿着B的prototype这条线来找，如果两条线能找到同一个引用，即同一个对象，那么就返回true。如果找到终点还未重合，则返回false。instanceof表示的就是一种继承关系，或者原型链的结构\r\n\r\n#####  上下文环境：\r\n函数每被调用一次，都会产生一个新的执行上下文环境。函数在定义的时候（不是调用的时候），就已经确定了函数体内部自由变量的作用域。在执行代码之前，把将要用到的所有的变量都事先拿出来，有的直接赋值了，有的先用undefined占个空。\r\n\r\n##### this指向问题\r\nthis指向问题本质上就是作用域问题。\r\njavascript除了全局作用域之外，只有函数可以创建的作用域。\r\n所以，我们在声明变量时，全局代码要在代码前端声明，函数中要在函数体一开始就声明好。除了这两个地方，其他地方都不要出现变量声明。而且建议用“单var”形式。\r\n在函数中this到底取何值，是在函数真正被调用执行的时候确定的，函数定义的时候确定不了。\r\n作用域有上下级的关系，上下级关系的确定就看函数是在哪个作用域下创建的，作用域最大的用处就是隔离变量，不同作用域下同名变量不会有冲突。作用域在函数定义时就已经确定了。而不是在函数调用时确定。\r\n作用域只是一个“地盘”，一个抽象的概念，其中没有变量。要通过作用域对应的执行上下文环境来获取变量的值。\r\n作用域中变量的值是在执行过程中产生的确定的，而作用域却是在函数创建时就确定了。\r\n如果要查找一个作用域下某个变量的值，就需要找到这个作用域对应的执行上下文环境，再在其中寻找变量的值。\r\n自由变量取值规则：要到创建这个函数的那个作用域中取值——是“创建”，而不是“调用”，切记切记。\r\n##### 闭包\r\n闭包就是能够读取其他函数内部变量的函数。\r\n_如在javascript中，只有函数内部的子函数才能读取局部变量，所以闭包可以理解成“定义在一个函数内部的函数“。在本质上，闭包是将函数内部和函数外部连接起来的桥梁。\r\n闭包包含自由（未绑定到特定对象）变量，这些变量不是在这个代码块内或者任何全局上下文中定义的，而是在定义代码块的环境中定义（局部变量）。“闭包” 一词来源于以下两者的结合：要执行的代码块（由于自由变量被包含在代码块中，这些自由变量以及它们引用的对象没有被释放）和为自由变量提供绑定的计算环境（作用域）_[来源百度百科](https://baike.baidu.com/item/%E9%97%AD%E5%8C%85/10908873?fr=aladdin)"}}
{"actor":{"display_login":"newued"}}