Chrome扩展开发:如何在嵌套函数间传递search_target变量?
解决Chrome扩展中变量无法传递到
chrome.tabs.update的问题 你遇到的问题根源在于错误地在chrome.tabs.query的回调函数中声明了search_target参数,这会覆盖外部作用域的同名变量,导致回调内部的search_target变成了chrome.tabs.query回调的第二个参数(也就是chrome.runtime.lastError,这里没有错误所以是undefined)。
修复步骤:
- 移除回调函数中的
search_target参数:利用JavaScript的闭包特性,回调函数可以直接访问外部search_target变量,不需要额外声明参数。 - (可选)修正URL域名:你的上下文菜单标题是"Open in Salesforce",但代码里写的是
http://www.facebook.com,如果是笔误可以改成Salesforce的域名。
修正后的完整代码:
function soso(search_target){ alert(search_target); // 这里能正常获取到变量 chrome.tabs.query({ url: "https://lightning.force.com/lightning/*"}, function(tabs){ if (tabs[0]){ chrome.tabs.update(tabs[0].id, { url: "https://lightning.force.com/lightning/" + search_target, // 现在能正常使用search_target了 active: true }); } else{ alert("no window"); } }); } function selectionHandler (info, tab) { soso( info.selectionText); } function resetContextMenus () { chrome.contextMenus.removeAll( function() { var id = chrome.contextMenus.create( { title: "Open in Salesforce", contexts: [ "selection" ], onclick: selectionHandler } ); } ); } resetContextMenus();
原理说明:
JavaScript的闭包允许内部函数(这里就是chrome.tabs.query的回调)访问外部函数作用域的变量,只要内部函数没有重新声明同名变量,就会直接使用外部的search_target值。你之前的代码在回调里加了search_target参数,相当于在回调作用域里重新定义了这个变量,覆盖了外部的值,所以才会出现undefined。
内容的提问来源于stack exchange,提问作者Joey
相关产品推荐
相关产品推荐

