- 主题:storage addListener(f)没反应,改成(x=>f(x))则可以。为啥? (
【 以下文字转载自 WebDev 讨论区 】
发信人: wushunchao ()(), 信区: WebDev
标 题: storage addListener(f)没反应,改成(x=>f(x))则可以。为啥?
发信站: 水木社区 (Wed Jan 15 21:38:26 2020), 站内
准备弄个chrome插件,contents.js:
这样子就没反应:
chrome.storage.local.onChanged.addListener(location.reload)
改成=>就可以了:
chrome.storage.local.onChanged.addListener(()=>location.reload())
这是为啥?
chrome 79, win7, x64
--
FROM 117.174.76.*
第一个相当于
var reload = location.reload; reload()
这个时候 reload 方法接受的 this 指向的是 global 对象。
可以简单改为 addListener(location.reload.bind(location))
--
FROM 120.52.147.*
这位版友基本功相当扎实啊。你的主业是做什么项目的?
【 在 zli07 (Anonymous) 的大作中提到: 】
: 第一个相当于
: var reload = location.reload; reload()
: 这个时候 reload 方法接受的 this 指向的是 global 对象。
: 可以简单改为 addListener(location.reload.bind(location))
--
FROM 116.234.18.*
然而并不对啊,this 啥取决于 caller 的 this 是啥。首先 browser 里没有 global,其次没有在 event callback 里用 window 当 this 的习惯。按照 dom 习惯是 onChange,那么相当于 location.reload.call(storage.onChange)
【 在 javaboy (喝了咖啡就话多-_-;) 的大作中提到: 】
: 这位版友基本功相当扎实啊。你的主业是做什么项目的?
--
FROM 122.59.30.*
哈,我就是整js的
【 在 javaboy 的大作中提到: 】
: 这位版友基本功相当扎实啊。你的主业是做什么项目的?
:
--
FROM 120.52.147.*
对的啊。
chrome的location.reload方法会检查this是否location,不是就不执行:
location.reload.apply(window)
VM883:2 Uncaught TypeError: Illegal invocation
location.reload.apply(document)
VM883:2 Uncaught TypeError: Illegal invocation
location.reload.apply(document.body)
VM883:2 Uncaught TypeError: Illegal invocation
location.reload.apply(undefined)
VM883:2 Uncaught TypeError: Illegal invocation
location.reload.apply()
VM883:2 Uncaught TypeError: Illegal invocation
location.reload.apply(location) // ok
location.reload.bind(location)() // ok
【 在 eGust (十年) 的大作中提到: 】
: 然而并不对啊,this 啥取决于 caller 的 this 是啥。首先 browser 里没有 global,其次没有在 event callback 里用 window 当 this 的习惯。按照 dom 习惯是 onChange,那么相当于 location.reload.call(storage.onChange)
--
FROM 116.234.18.*
手艺真不错
【 在 zli07 (Anonymous) 的大作中提到: 】
: 哈,我就是整js的
--
FROM 116.234.18.*
bind 是标准解决方式,我并不是说它有问题。而是上下文 this 变量并不是 global(因为不存在),而且也不大可能是 window。
【 在 javaboy (喝了咖啡就话多-_-;) 的大作中提到: 】
: 对的啊。
: chrome的location.reload方法会检查this是否location,不是就不执行:
: location.reload.apply(window)
: ...................
--
FROM 122.59.30.*
对呀,就是你说的。所以楼主的第一种写法在chrome里会出错啊。
【 在 eGust (十年) 的大作中提到: 】
: bind 是标准解决方式,我并不是说它有问题。而是上下文 this 变量并不是 global(因为不存在),而且也不大可能是 window。
--
FROM 116.234.18.*
他是说,你 M 的贴里,“这个时候 reload 方法接受的 this 指向的是 global 对象。”这句话不对,其他的没问题。
【 在 javaboy (喝了咖啡就话多-_-;) 的大作中提到: 】
: 标 题: Re: storage addListener(f)没反应,改成(x=>f(x))则可以。为啥
: 发信站: 水木社区 (Fri Jan 17 10:13:22 2020), 站内
:
: 对呀,就是你说的。所以楼主的第一种写法在chrome里会出错啊。
:
: 【 在 eGust (十年) 的大作中提到: 】
: : bind 是标准解决方式,我并不是说它有问题。而是上下文 this 变量并不是 global(因为不存在),而且也不大可能是 window。
:
:
: --
:
: ※ 来源:·水木社区 newsmth.net·[FROM: 116.234.18.*]
--
FROM 1.85.217.*