闭包是一个第一类函数,它引用(关闭)变量来自定义它的作用域。如果闭包在其定义范围结束后仍然存在,则它关闭的变量也将继续存在。
从“react”导入 React, { useState }; 从“react-dom”导入ReactDOM; 函数应用程序(){ const [count, setCount] = useState(0); 函数handleAlertClick() { 返回(
众所周知,Groovy 语法接受闭包。 今天,Java 8 添加了语法闭包。 但是,当我在 Groovy 文件中编写 Java 8 闭包时,出现如下错误: 人.fin...
关闭Javascript。为什么如果返回内部变量我就无法访问它
const crateCounter = () => { 让计数 = 0 常量增量 = () => { 计数++ } const getCount = () => { 返回计数 } 返回 { 增量,获取计数,计数 } } 让我们一起...
我知道一个问题,即 C++ 中闭包的行为与其他编程语言不同(它们扩展了捕获变量的生命周期并具有 GC) 如果我们写这样的代码 自动发电机()...
为什么 [weak self] 可以工作,但 [unowned self] 会在 Swift 闭包中崩溃?
此 SpriteKit 操作通过使用完成闭包调用自身来重复。 它使用闭包,而不是 SKAction.repeatActionForever(),因为它需要每个生成一个随机变量
我在 Go 程序中看到一些意外行为,希望有人可以向我解释一下。 我有以下基本程序: 包主 进口 ( “FMMT” “日志&q...
我在 Go 程序中看到一些意外行为,希望有人可以向我解释一下。 我有以下基本程序: 包主 进口 ( “FMMT” “日志&q...
为什么传递给map()的闭包不带引用,而传递给filter()的闭包带引用?
传递给map()的闭包不接受引用,而传递给filter()的闭包在Rust中接受引用。大多数迭代器适配器都会引用。 map() 这样做有什么原因吗...
在Python标准库模块contextvars的文档中,指出: 上下文变量应该在顶层模块级别创建,而不是在闭包内创建。 然而,我不...
在 Swift 中使用 @autoclosure:它的行为可以像重载函数吗?
我有一个使用@autoclosure的函数。有没有办法让 @autoclosure 的行为与重载函数类似,这样它就会自动知道哪种语法适合像我这样的变量......
我浏览了资源,发现使用 getter 方法从类访问值是一种闭包形式。由于资源是人工智能生成的,我正在验证这是否确实......
我正在尝试使用 Rust 中的示例程序来理解闭包,如下所示。但我在下面的“定义关闭之后”行中遇到了错误。 让 mut list = vec![1, 2, 3]; 打印!(“
不确定这是否是 Swift、XCode 或 Alamofire 的问题,但我在我的混合 Swift/Objc 应用程序中的不同位置发现了奇怪的行为。它只发生在用 Swift 编写的部分......
我将其分解为一个简单的示例,循环遍历一些内容,但将其分解为级别。 我正在内部循环中实例化本地副本,但这似乎不起作用。 当您尝试...
在 PHP 中,什么是闭包以及为什么它使用“use”标识符?
我正在检查一些 PHP 5.3.0 功能,并在网站上发现了一些看起来很有趣的代码: 公共函数 getTotal($tax) { 总计 = 0.00 美元; $回调= /* 这行在这里...
在 redux-saga 调用调用的函数中对“this”的引用为空
我正在学习 redux-saga,并尝试将其集成到一个项目中,该项目使用由 openapi-generator 生成的 API,该生成器会生成如下所示的输出: 异步登录用户(正文:Logi...
这个想法是,您将 lambda 传递给一个类,并且您希望在将其传递给该类后更改实现,但该类没有公开任何更新 lambda 实现的方法....
我正在使用 wry 生成一些网络视图。每个视图都有一个 on_page_load_handler。在处理程序内部,我需要访问 Web 视图,例如导航到另一个网站。遗憾的是我没能通过网络竞争...
JS:为书签脚本注入 BoundFunctionObject
假设我正在编写一个书签脚本来修改网页。大多数网站(使用 webpack 等)都遵循这样的结构: <question vote="1"> <div> </div> <p>假设我正在编写一个书签脚本来修改网页。大多数网站(使用 webpack 等)都遵循这样的结构:</p> <pre><code><html> <script type="text/javascript"> const buttonClicked = (() => { let internal_variable = 0; const _internal_buttonClicked = () => { internal_variable++; document.getElementById("myButton").innerText = `Clicked ${internal_variable} times!`; }; return _internal_buttonClicked.bind(this); })(); </script> <body> <button id="myButton" onclick="buttonClicked()">Clicked 0 times!</button> </body> </html> </code></pre> <p>我想访问 <pre><code>internal_variable</code></pre> 并将其设置为 -100。使用调试器,这很简单;我在<pre><code>_internal_buttonClicked()</code></pre>里面断点,然后直接改<pre><code>internal_variable</code></pre>。</p> <p>我怎样才能做到这一点而不</p> <ul> <li>(手动)使用调试器</li> <li>拥有页面源的所有权(例如,我可以在本地对其进行修改,但我不能只发送拉取请求以将挂钩添加到脚本中)</li> <li>使其成为对 DOM 的纯粹视觉更改?</li> </ul> <p>我知道简单的答案是“你不能,故意”,但我愿意接受任何迂回的解决方案,涉及浏览器扩展/特权执行的解决方案,特定于<pre><code>require</code></pre>的解决方案等</p> <p>相关:</p> <ul> <li><a href="https://stackoverflow.com/questions/42602954/how-to-get-parameters-that-have-been-bound-by-javascripts-bind-function">如何获取JavaScript的.bind()函数绑定的参数</a></li> <li><a href="https://stackoverflow.com/questions/11192875/is-it-possible-to-gain-access-to-the-closure-of-a-function">是否可以访问函数的闭包?</a>(此处的最佳解决方案取决于成为第一个加载的脚本,这对于小书签来说通常是不可行的?有没有办法使页面重新加载并注入将脚本放入刷新页面的顶部?)</li> </ul> </question> <answer tick="false" vote="0"> <p>无法为 <pre><code>internal_variable</code></pre> 分配新值,因为它不在您的代码范围内。您也不能将新函数分配给 <pre><code>buttonClicked</code></pre>,因为它是一个常量。</p> <p>但根据实际情况,你可以采取其他一些方法。以下是一些适用于您的示例案例的内容:</p> <h2>1.覆盖<pre><code>innerText</code></pre></h2> <p>让它更改按钮上显示的数字,方法是始终从即将显示的值中减去 100。</p> <p>你的代码会有这样的:</p> <pre><code> Object.defineProperty(document.getElementById("myButton"), "innerText", { set(text) { // Subtract 100 from the number in the text "Clicked <number> times!" text = text.replace(/(Clicked )(\d+)( times!)/, (_, a, b, c) => a + (b - 100) + c); // Call the prototype setter for innerText Object.getOwnPropertyDescriptor(HTMLElement.prototype, "innerText").set.call(this, text); } }); </code></pre> <p>扁平化为小书签:</p> <pre><code>javascript: {Object.defineProperty(document.getElementById("myButton"),"innerText",{set(text) {text=text.replace(/(Clicked )(\d+)( times!)/,(_,a,b,c)=>a+(b-100)+c);Object.getOwnPropertyDescriptor(HTMLElement.prototype,"innerText").set.call(this, text);}});} </code></pre> <h2>2.创建一个新函数<pre><code>buttonClicked2</code></pre></h2> <p>它应该有对计数器进行修改的代码。然后将每次调用 <pre><code>buttonClicked</code></pre> 更改为 <pre><code>buttenClicked2</code></pre>。这里我假设就像示例中一样,此类引用仅存在于按钮的 <pre><code>onclick</code></pre> 属性中。此调用的位置越多,您可能需要复制为新函数的函数就越多,还需要重新连接对 <em>that</em> 函数的引用,...等。但这里只有 <pre><code>onclick</code></pre> 属性受到影响:</p> <pre><code> var buttonClicked2 = (() => { let internal_variable = -100; // Our update const _internal_buttonClicked = () => { internal_variable++; document.getElementById("myButton").innerText = `Clicked ${internal_variable} times!`; }; return _internal_buttonClicked.bind(this); })(); // Redirect the click document.getElementById("myButton").setAttribute("onclick", "buttonClicked2()"); </code></pre> <p>扁平化为小书签:</p> <pre><code>javascript: {var buttonClicked2=(()=>{let internal_variable=-100;const _internal_buttonClicked=()=>{internal_variable++;document.getElementById("myButton").innerText=`Clicked ${internal_variable} times!`;};return _internal_buttonClicked.bind(this);})();document.getElementById("myButton").setAttribute("onclick", "buttonClicked2()");} </code></pre> <h2>3.创建一个页面填充 <pre><code><iframe></code></pre></h2> <p>在其中 <pre><code><iframe></code></pre> 放置当前的 HTML,但修改您想要的代码。因此,页面将重新加载,但经过您的修改并显示为 <pre><code><iframe></code></pre>。</p> <pre><code>if (window === top) { // Patch the HTML let html = document.documentElement.innerHTML .replace("internal_variable = 0;", "internal_variable = -100;"); let iframe = `<body style="margin:0"><iframe style="display:block;border:0;height:100%;width:100%"></iframe></body>`; // Replace the current document with just an <iframe> document.write(iframe); // Write the patched HTML to the frame document document.querySelector("iframe").srcdoc = html; } </code></pre> <p>扁平化为小书签:</p> <pre><code>javascript: if(window===top){let html = document.documentElement.innerHTML.replace("internal_variable = 0;", "internal_variable = -100;");let iframe = `<body style="margin:0"><iframe style="display:block;border:0;height:100%;width:100%"></iframe></body>`;document.write(iframe);document.querySelector("iframe").srcdoc=html;} </code></pre> <h2>限制</h2> <p>上述每种解决方案都有其局限性。其中之一是否适合现实生活中的情况将在很大程度上取决于页面的功能。</p> </answer> </body></html>