在bash中执行命令替换的首选方法是什么?
我总是这样做:
echo "Hello, `whoami`."
Run Code Online (Sandbox Code Playgroud)
但最近,我经常看到它写得像这样:
echo "Hello, $(whoami)."
Run Code Online (Sandbox Code Playgroud)
什么是首选语法,为什么?或者他们几乎可以互换?
我倾向于赞成第一个,因为我的文本编辑器似乎知道它是什么,并且适当地进行语法高亮.
我在这里读到,在每种情况下,转义字符的行为都有所不同,但我不清楚哪种行为更可取,或者它只取决于具体情况.
附带问题:在一个脚本中使用两个表单是不好的做法,例如嵌套命令替换时?
有没有办法pre通过CSS 模拟元素的显示?
例如,我可以使用CSS规则在此div中保持空格完整吗?
<div class="preformatted">
Please procure the following items:
- Soup
- Jam
- Hyphens
- Cantaloupe
</div>
Run Code Online (Sandbox Code Playgroud) 我刚检查了我的Chromium任务经理,发现我的Goats Teleported计数异常高.我认为创建一个浏览器扩展可能是一个好主意,该扩展通过Google Visualizations API运行山羊传送数据并生成一些不错的报告,因此我可以轻松跟踪它并确保它不会失控.
替代文字http://img820.imageshack.us/img820/4885/screenshottaskmanagerch.png
是否可以Goats Teleported通过chrome扩展API 以编程方式访问计数?您认为我应该如何格式化报告?我想的可能是饼图?
javascript google-chrome google-visualization google-chrome-extension
我在Appengine上使用Django.我reverse()到处都在使用django 功能,尽可能保持干燥.
但是,我在将这个应用到我的客户端javascript时遇到了麻烦.有一个JS类根据传入的ID加载一些数据.有没有一种标准的方法来对这些数据应该来自的URL进行硬编码?
var rq = new Request.HTML({
'update':this.element,
}).get('/template/'+template_id+'/preview'); //The part that bothers me.
Run Code Online (Sandbox Code Playgroud) 假设我想console.log为某些合法的生产原因包含一些调用,比如像单元测试工具这样的东西.显然,如果浏览器没有console,或者如果没有控制台,我不希望这会抛出一个过早的异常.
创建一个简单的log函数来将内容记录到控制台的最佳方法是什么,或者如果没有控制台,则默默地失败而没有错误?
上面提到的问题的答案是:
Run Code Online (Sandbox Code Playgroud)var log = Function.prototype.bind.call(console.log, console); log.apply(console, ["this", "is", "a", "test"]);
可以log在IE上正常调用此函数,apply这里的使用只是为了表明它是可能的吗?并且,我从链接的问题中假设,如果IE的控制台在运行时关闭,这将失败,因此log即使在控制台打开后也无法工作,对吗?如果这是错的,有人可以解释它是如何工作的吗?
这篇ycombinator文章似乎很相关.他们是否正在谈论与上面链接的问题相同的IE行为?
Run Code Online (Sandbox Code Playgroud)Function.prototype.apply.apply(console.log, [console, arguments]);适用于IE9破解的console.log和其他供应商的常规console.log.与使用Array.prototype.slice将参数转换为实数组相同的hack.
这在我的chrome控制台中运行良好.
function echo(){
Function.prototype.apply.apply(console.log, [console, arguments]);
}
Run Code Online (Sandbox Code Playgroud)
简化:
function echo(){
Function.apply.call(console.log, console, arguments);
}
Run Code Online (Sandbox Code Playgroud)
添加支票并返回:
function echo(){
return window.console && console.log &&
Function.apply.call(console.log, console, arguments);
}
Run Code Online (Sandbox Code Playgroud)
上面的例子对我来说足够了.不过,我手头没有IE来测试它.这是安全包装的合理方法console.log吗?
更多问题
按照下面导航答案中的链接,我们看到代码:
Function.prototype.call.call(console.log, console,
Array.prototype.slice.call(arguments));
Run Code Online (Sandbox Code Playgroud)
arguments在这种情况下转换为数组的目的是什么?我想如果你不这样做,它必须在某些浏览器中失败?并且,除了歌剧奇怪的行为和无控制台的浏览器之外,这样的东西不应该适用于其他所有浏览器吗?并且确实prototype在上面的例子中起到了作用,或者我们只是在迂腐... Function.call.call或者Object.call.call或者就此而言isNaN.call.call似乎也是如此Function.prototype.call.call …
概述和原始问题
window.name是一个有趣的野兽.MDN的描述暗示了原始意图:
窗口名称主要用于设置超链接和表单的目标.Windows不需要名称.
所以,这意味着我们可以在这个窗口中打开控制台,并写道:
var win = window.open('http://google.com', 'el goog');
Run Code Online (Sandbox Code Playgroud)
...然后让它通过弹出窗口拦截器,它应该在一个名为"el goog"的窗口中打开google.com.由于同源策略,我无法访问name属性win,但如果我在新窗口中打开一个控制台并输入name,我就会得到"el goog".
如果我将窗口发送回我打开它的域(在这种情况下是stackoverflow.com),我可以获取name属性,但它没有改变.
win.location.replace(location.href);
win.name; // "el goog"
Run Code Online (Sandbox Code Playgroud)
这意味着我们可以通过设置name窗口的属性来拥有一种跨域会话存储.
如果google.com 在窗口被发送回原始域之前更改了值window.name,我们会看到新值而不是"el goog".这可以用作跨域数据传输,类似于JSONP或CORS的实用程序.
我做了一些搜索试图找到更多的信息,显然道场认为它是合法的运输.但不知何故,这并不能完全让我放心.所以我的问题是,任何信誉良好的网站都window.name用作数据传输吗?我认为它很容易被发现,因为他们的文档会对JSONP的查询字符串说" 添加回调",或者为window.name添加'what',但我从未见过这样的东西.有没有人在野外发现过这个?
替代问题
可能是没有人真正使用这种技术; 如果那是真的那么(正如Rob W指出的那样)上面的问题是无法回答的.所以,我的另一个问题是,这种方法有什么问题?这可能有助于解释为什么它没有被真正采用.
我认为,与JSONP相比,这种方法至少有两个好处.
使用JSONP,您可以信任来自外地的脚本在您的域上运行.使用window.name,恶意站点包含的任何脚本都可以在自己的域上运行.
使用JSONP,无法传递大数据(对于URL来说太大了),也无法进行HTTP POST.有了window.name,我们可以发布任意大小的任意数据.
有什么缺点?
示例实现
这是客户端实现的一个非常简单的示例.这不处理POST请求,只处理GET.
function fetchData(url, callback) {
var frame = document.createElement('iframe');
frame.onload = function() {
frame.onload = function() { …Run Code Online (Sandbox Code Playgroud) 有没有办法将位置鼠标放在<canvas>标签内?我想要相对于右上角的位置<canvas>,而不是整个页面.
有什么意义document.defaultView?
MDN说:
在浏览器中返回与文档关联的窗口对象,如果没有,则返回null.
以下代码(来自PPK的网站)使用document.defaultView:
function getStyle(el,styleProp)
{
var x = document.getElementById(el);
if (x.currentStyle)
var y = x.currentStyle[styleProp];
else if (window.getComputedStyle)
var y = document.defaultView.getComputedStyle(x,null).getPropertyValue(styleProp);
return y;
}
Run Code Online (Sandbox Code Playgroud)
像这样的代码可以在其他地方找到,比如David Mark的My Library.我不确定人们是否只是从PPK或其他来源复制或独立提出,但我不明白.
我的问题是,document.defaultView在这种情况下使用的重点是什么?写这个不是更容易如下:
function getStyle(element, styleProp) {
if (element === ''+element) element = document.getElementById(element);
return element.currentStyle ? element.currentStyle[styleProp] :
getComputedStyle(x,null).getPropertyValue(styleProp);
}
Run Code Online (Sandbox Code Playgroud)
document.defaultView.getComputedStyle做什么window.getComputedStyle或根本getComputedStyle不做什么?
cwolves的回答让我思考正确的方向.原来的功能是愚蠢的,错过了重点defaultView.我上面提出的建议不那么愚蠢,但也忽视了这一点defaultView.这是我的新提案:
function getStyle(element, styleProp) {
var view = element.ownerDocument && …Run Code Online (Sandbox Code Playgroud) 在未知主机环境中以ES5严格模式获取全局对象句柄的推荐方法是什么?
ECMAScript没有提供引用我所知道的全局对象的内置方法.如果是这样,这就是我正在寻找的答案.
在已知环境中,全局对象通常具有自引用属性.由于全局对象是全局范围的VO,因此全局对象的属性是全局变量,因此我们可以使用它们从任何位置获取全局对象的句柄:
在Web浏览器中,我们可以使用window或self.
在node.js中,我们可以使用global.
但是,并非所有主机环境都是如此.据我所知,Windows Script Host不提供任何访问全局对象的方法.在WSH中获取全局对象的推荐方法似乎是this在不解析为对象的上下文中使用该关键字.例如:
var GLOBAL = (function(){return this}());
Run Code Online (Sandbox Code Playgroud)
此技术适用于任何主机环境,但不适用于严格模式,因为undefined this不会在严格模式下引用全局对象:
如果在严格模式代码中对此进行评估,则不会将此值强制转换为对象.此null或undefined值不会转换为全局对象,并且原始值不会转换为包装器对象.通过函数调用传递的此值(包括使用Function.prototype.apply和Function.prototype.call进行的调用)不会强制将此值传递给对象(10.4.3,11.1.1,15.3.4.3,15.3. 4.4).
正如所料,以下代码导致undefined:
(function(){
"use strict";
var GLOBAL = (function(){return this}());
console.log(GLOBAL);
}());
Run Code Online (Sandbox Code Playgroud)
那么,无论严格模式如何,在任何环境中获取全局对象句柄的正确方法是什么?
顺便说一句,我目前的方法是嗅探引用全局对象的全局变量,如下所示:
var self, window, global = global || window || self;
Run Code Online (Sandbox Code Playgroud)
......然后才使用global.我认为这是一个糟糕的解决方案,原因有很多,其中大多数是相当明显的,并没有解决WSH问题.
首先,我认为时区可能与此有关.我在EST/EDT.另外,我正在使用chrome 17/linux进行测试.
现在,假设我创建了两个这样的日期:
// December 5
dateFromNumbers = new Date(2020, 11, 5);
dateFromString = new Date("2020-12-5");
Run Code Online (Sandbox Code Playgroud)
看来这些日期应该具有相同的时间戳,它们会:
+dateFromNumbers == +dateFromString; // true
Run Code Online (Sandbox Code Playgroud)
......至少在这种情况下.但在某些情况下,它们不会:
// December 15
dateFromNumbers = new Date(2020, 11, 15);
dateFromString = new Date("2020-12-15");
+dateFromNumbers == +dateFromString; // false
Run Code Online (Sandbox Code Playgroud)
这里发生了什么?
dateFromNumbers; // Tue Dec 15 2020 00:00:00 GMT-0500 (EST)
dateFromString; // Mon Dec 14 2020 19:00:00 GMT-0500 (EST)
Run Code Online (Sandbox Code Playgroud)
看起来dateFromString比dateFromNumbers在这种情况下提前5小时(EST是格林尼治标准时间 - 5,我确定它与某种方式相关).
这似乎影响了10月到12月的月末.这是一个小提琴,可以很容易地看出哪些日子不同(除非你是红绿色盲,在这种情况下可能很难看到,我的道歉).
是什么赋予了?
笔记:
11不是一个错字.javascript ×8
ajax ×1
bash ×1
canvas ×1
command ×1
console ×1
constructor ×1
css ×1
date ×1
django ×1
dom ×1
dry ×1
ecma262 ×1
ecmascript-5 ×1
global ×1
html ×1
html5 ×1
logging ×1
pre ×1
shell ×1
strict-mode ×1
substitution ×1
whitespace ×1
wrapper ×1